2013-05-31 13 views
6

Klucz tablicy ustawionej dla właściwości innego obiektu (dataController w BWMasterViewController) z silnym odwołaniem staje się null. Nie rozumiem, dlaczego.Właściwość obiektu z silnym odniesieniem staje się pusta

BWMasterViewController

nagłówek:

#import <UIKit/UIKit.h> 

@class BWBirdSightingDataController; 

@interface BWMasterViewController : UITableViewController 
@end 

realizacja:

#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

nagłówek:

#import <Foundation/Foundation.h> 

@class Bird; 

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

realizacja:

#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 

Ptak

Ptak jest NSManagedObject oparciu o CoreData podmiotu.

nagłówek:

#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 

wdrożeniowe:

#import "Bird.h" 


@implementation Bird 

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

@end 

Wyjście

Kiedy go uruchomić, to wyjścia:

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) 

Więc jak widać, w viewDidLoad funkcja the bird.name ma teraz wartość null. Dlaczego? Ogłosiłem właściwość jako silne odniesienie.

Mam ten sam problem, gdy zdefiniowałbym self.dataController w viewDidLoad, wtedy byłby on pusty w prepareForSegue, gdzie również go potrzebuję.

+0

Pokaż swój kod BWBirdSightingDataController –

+1

@AttilaH dodał go – rednaw

+0

Dodaj więcej rejestrowania lub użyj debuggera, aby przejrzeć kod. Często sprawdzaj, czy 'self.birds' nie jest zerowe.Podejrzewam, że cała tablica staje się nieważna. – Till

Odpowiedz

8

Obiekty są tworzone w initializeDefaultDataList przy użyciu lokalnego BWDataController *dataController. dataController jest automatycznie zwalniany na końcu tej metody, co prawdopodobnie oznacza, że ​​kontekst obiektu zarządzanego nie istnieje.

Jednak obiekt zarządzany może działać tylko w kontekście, w którym został utworzony. Jeśli kontekst zostanie zniszczony, to właśnie tak się stanie: Uzyskanie dostępu do wszystkich właściwości zwraca nil.

Możliwe rozwiązania:

  • Złóż dataController silnym właściwością BWBirdSightingDataController zamiast zmiennej lokalnej.
  • Użyj współdzielonego kontekstu obiektów zarządzanych w aplikacji.
+0

OK, wystarczy. Jak mogę zachować te obiekty "Ptak" w mojej "ptasiej" własności? Myślałem, że mogę "BWBirdSightingDataController" zarządzać komunikacją z Core Data, zabezpieczyć wymagane dane wewnętrznie i przekazać je do 'BWMasterViewController'. Jak bym to zrobił? – rednaw

+0

@rednaw: Zobacz zaktualizowaną odpowiedź. –

+0

Tak, uczyniłem 'dataController' silną własnością, teraz działa! Dzięki! – rednaw

Powiązane problemy