3

J'ai deux contrôleurs tableview montrant des objets CoreData. L'un est une vue de détail (avec des phrases) on est un aperçu (avec des histoires). Choisissez une histoire -> Voir les phrases.Pourquoi n'ai-je pas besoin de publier managedObjectContext dans le 2nd TableViewController?

Il semble que j'étais en train de relâcher mon managedObjectContext; Je l'ai d'abord publié dans TableViewControllers dans dealloc et j'ai eu un plantage toutes les trois fois entre les deux contrôleurs (Histoire -> Phrase -> Histoire -> Phrase -> Histoire -> Crash). Certains débogage montré que je plantait dans mon délégué App après ce code dans viewDidLoad des deux TableViewControllers:

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext: %@", managedObjectContext); 
} 

plus de recherche a trouvé this discussion ce qui m'a amené à croire qu'il était un cas d'un plus publié ManagedObjectContext:

Le deuxième problème plus prosaïque est simplement un NSManagedObject surchargé. Instruments ObjectAlloc outil devrait être en mesure d'aider vous.

J'ai donc supprimé [version de managedObjectContext]; de mon dealloc dans TableViewController et maintenant je n'ai pas de fuites (selon Instruments) et pas de crash.

Il semble que le problème est résolu, mais voici la question:

  • je pourrais être tout à fait le point manquant, et juste cacher une autre question. Comment puis-je trouver la sur-version, ou le vrai problème?

  • Si j'ai résolu le problème, je voudrais savoir pourquoi il est fixé et pourquoi je ne ai pas besoin de libérer le MOC dans le deuxième TableViewController

MakeSentenceTableViewController.m

@implementation MakeSentenceTableViewController 
@synthesize story, managedObjectContext; 
- (void)viewDidLoad { 
[super viewDidLoad]; 

self.title = @"My Story"; 
NSLog(@"Passed Story Object: %@", story); 
if (managedObjectContext == nil) 
{ 
    NSLog(@"managedObjectContext == nil"); 
    managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext: %@", managedObjectContext); 
}else{ 
    NSLog(@"managedObjectContext != nil"); 
} 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentence" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

//sorting stuff: 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order" ascending: YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
//[request setFetchBatchSize:FETCH_BATCH_SIZE]; 
[sortDescriptors release]; 
[sortDescriptor release]; 

fetchedResultsController = [[NSFetchedResultsController alloc] 
          initWithFetchRequest:request managedObjectContext:managedObjectContext 
          sectionNameKeyPath:nil cacheName:nil]; 
[request release]; 

NSError *error; 
[fetchedResultsController performFetch:&error]; 

NSLog(@"FetchedResultsController: %@", fetchedResultsController); 
NSLog(@"fetchedResultsController RetainCount at viewDidLoad: %d",  [fetchedResultsController retainCount]); 
} 
//snip...table view bits 
- (void)dealloc { 
[fetchedResultsController release]; 
//Why don't I have to release this? 
//[managedObjectContext release]; 
    [super dealloc]; 
} 

Répondre

6

Parce que vous ne le retenez pas. Même si la propriété "MOC" dans le contrôleur de vue est (conserve), vous n'appelez pas le setter mais vous définissez simplement la référence directement. Si vous souhaitez le conserver et le libérer, vous devez appeler self.managedObjectContext = ... à la place (notez le point), ce qui équivaut à [self setManagedObjectContext: ...] et seulement alors vous pouvez libérer en toute sécurité dans le dealloc. En fait, puisque le "MOC" est détenu par et géré par le délégué de l'application, je ne prendrais même pas la peine de le conserver.

+0

Brillant, merci pour la réponse rapide et utile. – glenstorey

Questions connexes