2013-05-31 6 views
6

Ключ массива, который установлен на свойство на другом объекте (dataController в BWMasterViewController) с сильной ссылкой, становится null. Я не понимаю, почему.Свойство объекта с сильной ссылкой становится null

BWMasterViewController

Заголовок:

#import <UIKit/UIKit.h> 

@class BWBirdSightingDataController; 

@interface BWMasterViewController : UITableViewController 
@end 

реализация:

#import "BWMasterViewController.h" 
#import "BWBirdSightingDataController.h" 
#import "Bird.h" 
#import "BWWebviewController.h" 

@interface BWMasterViewController() 
@property (strong, nonatomic) BWBirdSightingDataController *dataController; 
@property (copy, nonatomic) NSString *test; 
@end 

@implementation BWMasterViewController 

- (void)awakeFromNib 
{ 

    [super awakeFromNib]; 

    NSLog(@"awake from nib"); 
    self.dataController = [[BWBirdSightingDataController alloc] init]; 
    self.test = @"Test var"; 

    NSLog(@"test: %@", self.test); 
    Bird *bird = [self.dataController objectInListAtIndex:0]; 
    NSLog(@"bird object: %@", bird); 
    NSLog(@"bird name: %@", bird.name) 

} 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    NSLog(@"view did load"); 

    NSLog(@"test: %@", self.test); 
    Bird *bird = [self.dataController objectInListAtIndex:0]; 
    NSLog(@"bird object: %@", bird); 
    NSLog(@"bird name: %@", bird.name) 

} 

// .... 

BWBirdSightingDataController

Заголовок:

#import <Foundation/Foundation.h> 

@class Bird; 

@interface BWBirdSightingDataController : NSObject 
- (NSUInteger)countOfList; 
- (Bird *)objectInListAtIndex:(NSUInteger)theIndex; 
@end 

реализация:

#import "BWBirdSightingDataController.h" 
#import "BWDataController.h" 
#import "Bird.h" 

@interface BWBirdSightingDataController() 
-(void)initializeDefaultDataList; 
@property (nonatomic, copy) NSMutableArray *birds; 
@end 

@implementation BWBirdSightingDataController 

- (id)init 
{ 

    if (self = [super init]) { 
     [self initializeDefaultDataList]; 
     return self; 
    } 

    return nil; 

} 

- (void)initializeDefaultDataList 
{ 

    BWDataController *dataController = [[BWDataController alloc] init]; 

    NSEntityDescription *birdsEntity = [NSEntityDescription 
             entityForName:@"Bird" 
             inManagedObjectContext:dataController.managedObjectContext]; 
    NSFetchRequest *fetchBirds = [[NSFetchRequest alloc] init]; 
    [fetchBirds setEntity:birdsEntity]; 

    NSError *fetchError = nil; 
    NSArray *birdsObjects = [dataController.managedObjectContext 
          executeFetchRequest:fetchBirds 
          error:&fetchError]; 
    self.birds = [birdsObjects mutableCopy]; 

} 

- (NSUInteger)countOfList 
{ 
    return [self.birds count]; 
} 

- (Bird *)objectInListAtIndex:(NSUInteger)theIndex 
{ 
    return self.birds[theIndex]; 
} 

@end 

Птица

Птица является NSManagedObject на основе CoreData Entity.

Заголовок:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 


@interface Bird : NSManagedObject 

@property (nonatomic, retain) NSDate * date; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSString * image; 
@property (nonatomic, retain) NSString * url; 

@end 

реализации:

#import "Bird.h" 


@implementation Bird 

@dynamic date; 
@dynamic name; 
@dynamic location; 
@dynamic image; 
@dynamic url; 

@end 

Выход

Когда я запускаю его, это выходы:

2013-05-31 11:36:47.824 BirdWatching[69565:c07] awake from nib 
2013-05-31 11:36:47.834 BirdWatching[69565:c07] test: Test var 
2013-05-31 11:36:47.834 BirdWatching[69565:c07] bird object: <Bird: 0x8545ec0> (entity: Bird; id: 0x8545040 <x-coredata://D24A664F-8E8F-4AF0-891C-098C8A7DD860/Bird/p1> ; data: <fault>) 
2013-05-31 11:36:47.835 BirdWatching[69565:c07] bird name: Pigeon 
2013-05-31 11:36:47.839 BirdWatching[69565:c07] view did load 
2013-05-31 11:36:47.840 BirdWatching[69565:c07] test: Test var 
2013-05-31 11:36:47.840 BirdWatching[69565:c07] bird object: <Bird: 0x8545ec0> (entity: Bird; id: 0x8545040 <x-coredata://D24A664F-8E8F-4AF0-891C-098C8A7DD860/Bird/p1> ; data: <fault>) 
2013-05-31 11:36:47.840 BirdWatching[69565:c07] bird name: (null) 

Так как вы можете видеть, в viewDidLoad функция bird.name стала нулевой. Как так? Я назвал это свойство сильной ссылкой.

У меня такая же проблема, когда я определял бы self.dataController в viewDidLoad, тогда это было бы 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

+0

Выразить код BWBirdSightingDataController –

+1

@AttilaH добавил он – rednaw

+0

Добавьте больше протоколирования или использовать отладчик для пошагового кода. Часто проверяйте, является ли 'self.birds' не нулем.Я подозреваю, что весь массив становится недействительным. – Till

ответ

8

Вы создаете объекты Bird в initializeDefaultDataList используя местные BWDataController *dataController. dataController автоматически освобождается в конце этого метода, что, вероятно, означает, что контекст управляемого объекта dataController.managedObjectContext также больше не существует.

Однако управляемый объект может жить только в том контексте, в котором он был создан. Если контекст уничтожен, то именно это происходит: доступ ко всем свойствам возвращает nil.

Возможные решения:

  • Сделать dataController сильное свойство BWBirdSightingDataController вместо локальной переменной.
  • Используйте общий контекст управляемого объекта в приложении.
+0

Хорошо, справедливо. Итак, как я могу сохранить эти объекты «Птицы» в своей собственности «птицы»? Я думал, что я могу управлять BWBirdSightingDataController данными с Core Data, безопасно хранить необходимые данные и обслуживать их в 'BWMasterViewController'. Как я могу это сделать? – rednaw

+0

@rednaw: см. Обновленный ответ. –

+0

Да, я сделал 'dataController' сильным свойством, теперь он работает! Благодаря! – rednaw

Смежные вопросы