我有兩個顯示CoreData對象的tableview控制器。一個是詳細視圖(帶句子),一個是概述(帶故事)。 選擇一個故事 - >查看句子。爲什麼我不必在第二個TableViewController中釋放managedObjectContext
它看起來像我過度釋放我的managedObjectContext;我最初在兩個TableViewControllers dealloc中發佈了它,並且每隔三次在兩個控制器(故事 - >句子 - >故事 - >句子 - >故事 - >崩潰)之間發生崩潰。 一些調試表明我這個代碼在viewDidLoad中都TableViewControllers後墜毀在我的應用程序代表:
if (managedObjectContext == nil)
{
managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}
一些調查研究發現this discussion這使我相信這是一個在發佈ManagedObjectContext的情況:
第二個更平淡的問題是簡單地過度發佈的NSManagedObject的 。儀器的ObjectAlloc工具應該可以幫你 你。
所以我刪除了[managedObjectContext release];從我在TableViewController的dealloc,現在我沒有泄漏(根據儀器),沒有崩潰。
它看起來像這個問題是固定的,但這裏的問題:
我可能會完全錯過了點,只是隱藏的另一個問題。我怎樣才能找到過度釋放或真正的問題?
如果我有固定的問題,我想知道爲什麼它是固定的,所以我並不需要釋放商務部在第二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];
}
輝煌,感謝您的迅速和有益的答案。 – glenstorey 2010-10-27 00:24:27