3

我有兩個顯示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]; 
} 

回答

6

因爲你沒有保留它。即使您查看控制器中的「MOC」屬性爲(保留),您也不會調用setter,而只是直接設置參考。如果你想保留並釋放它,你必須調用self.managedObjectContext = ...而不是(注意點),這相當於[self setManManagedObjectContext:...]然後纔可以安全地釋放它在dealloc中。實際上,由於「MOC」由應用程序代表擁有和管理,我甚至不願意保留它。

+0

輝煌,感謝您的迅速和有益的答案。 – glenstorey 2010-10-27 00:24:27

相關問題