2013-05-31 11 views
6

Una chiave di una matrice impostata su una proprietà su un altro oggetto (dataController in BWMasterViewController) con un riferimento forte diventa null. Non capisco perché.La proprietà dell'oggetto con riferimento sicuro diventa nulla

BWMasterViewController

intestazione:

#import <UIKit/UIKit.h> 

@class BWBirdSightingDataController; 

@interface BWMasterViewController : UITableViewController 
@end 

attuazione:

#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

intestazione:

#import <Foundation/Foundation.h> 

@class Bird; 

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

implementazione:

#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 

Uccello

Uccello è un NSManagedObject basata su un CoreData entità.

intestazione:

#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 

di implementazione:

#import "Bird.h" 


@implementation Bird 

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

@end 

uscita

quando l'eseguo, questo uscite:

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) 

Quindi, come si può vedere, in viewDidLoad function the bird.name è diventato nullo. Come mai? Ho dichiarato la proprietà come un riferimento forte.

Ho lo stesso problema quando definisco self.dataController in viewDidLoad, quindi sarebbe nullo in prepareForSegue, dove ho anche bisogno.

+0

Mostra il codice di BWBirdSightingDataController –

+1

@AttilaH aggiunse – rednaw

+0

Aggiungi più di registrazione o utilizzare il debugger per passare tramite il codice. Controllare frequentemente se "self.birds' non è nullo.Sospetto che l'intero array non sia più valido. – Till

risposta

8

Gli oggetti Bird vengono creati in initializeDefaultDataList utilizzando il numero locale BWDataController *dataController. dataController viene deallocato automaticamente alla fine di questo metodo, il che probabilmente significa che anche il contesto dell'oggetto gestito dataController.managedObjectContext non esiste più.

Tuttavia, un oggetto gestito può vivere solo nel contesto in cui è stato creato. Se il contesto viene distrutto, accade esattamente questo: Accesso a tutte le proprietà restituisce nil.

Possibili soluzioni:

  • guadagna dataController una forte proprietà di BWBirdSightingDataController invece di una variabile locale.
  • Utilizzare un contesto di oggetto gestito condiviso attraverso l'applicazione.
+0

Ok, abbastanza giusto. Quindi, come posso conservare questi oggetti 'Bird' nella mia proprietà' birds'? Stavo pensando che posso avere 'BWBirdSightingDataController' gestire la comunicazione con Core Data, proteggere internamente i dati richiesti e servirli a' BWMasterViewController'. Come potrei andare su questo? – rednaw

+0

@rednaw: vedere la risposta aggiornata. –

+0

Sì, ho reso 'dataController' una proprietà forte, ora funziona! Grazie! – rednaw

Problemi correlati