Почему мне не нужно освобождать managedObjectContext во втором TableViewController - PullRequest
3 голосов
/ 27 октября 2010

У меня есть два контроллера табличного представления, показывающих объекты CoreData.Один - подробный вид (с предложениями), другой - обзор (с историями).Pick a Story -> См. Предложения.

Похоже, я перевыпустил свой managedObjectContext;Первоначально я выпустил его в обоих TableViewControllers в dealloc и получал сбой каждый третий раз, когда переходил между двумя контроллерами (Story -> Sentence -> Story -> Sentence -> Story -> Crash).Некоторая отладка показала, что после моего кода в ViewDidLoad обоих TableViewControllers произошел сбой в моем делегате приложения:

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

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

Вторая более прозаическая проблема - просто переизданный NSManagedObject.Инструменты Инструмент ObjectAlloc должен быть в состоянии помочь вам.

Поэтому я удалил [managedObjectContext release];из моего dealloc в TableViewController, и теперь у меня нет утечек (в соответствии с инструментами) и нет сбоя.

Похоже, проблема решена, но вот вопрос:

  • Я мог бы вообще упустить момент и просто скрыть другую проблему.Как я могу найти перевыпуск или реальную проблему?

  • Если я исправлю проблему, я хотел бы знать, почему она исправлена ​​и почему мне не нужноосвободить MOC во втором 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];
}

1 Ответ

6 голосов
/ 27 октября 2010

Потому что вы его не удерживаете. Даже если свойство «MOC» в вашем контроллере представления (сохранить), вы не вызываете установщик, а просто устанавливаете ссылку напрямую. Если вы хотите сохранить и освободить его, вы должны вместо этого вызвать self.managedObjectContext = ... (обратите внимание на точку), что эквивалентно [self setManagedObjectContext: ...] и только после этого вы можете спокойно выпустить его в Deloloc. На самом деле, поскольку «MOC» принадлежит и управляется в делегате приложения, я даже не стал бы его сохранять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...