0

我正在使用core data,並有一個UITableViewController加載數據從core data。這是一個modal view,如果我第三次加載模態視圖,它會崩潰EXC_BAD_ACCESS核心數據:獲取結果控制器導致過度釋放/崩潰

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 

    // Create and configure a fetch request 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ride" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Create the sort descriptors array 
    NSSortDescriptor *sectionTitle = [[NSSortDescriptor alloc] initWithKey:@"dateStart" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sectionTitle, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Create and initialize the fetch results controller 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
    self.fetchedResultsController = aFetchedResultsController; 
    fetchedResultsController.delegate = self; 

    // Memory management 
    [aFetchedResultsController release]; 
    [fetchRequest release]; 
    [sectionTitle release]; 
    [sortDescriptors release]; 

    return fetchedResultsController; 

}//end 

崩潰說,它從該行未來:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ride" inManagedObjectContext:managedObjectContext]; 

這是在viewDidLoad中:

if (managedObjectContext == nil) { 
     managedObjectContext = [MyAppDelegate instance].managedObjectContext; 
    } 

呈現模式的看法:

History *history = [[[History alloc] init] autorelease]; 
UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:history] autorelease]; 
[self presentModalViewController:nav animated:YES]; 

解聘莫代爾:

- (void)done { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

堆棧跟蹤,讓EXC_BAD_ACCESS:現在

enter image description here

,爲了建立這種觀點與核心數據,我跟着Core Data Books示例項目和我的代碼看起來幾乎相同。爲什麼在幾次加載模態視圖後會崩潰?

+0

此代碼看起來沒問題,還有其他事情正在進行。如果您認爲這與多次展示模態視圖有關,請檢查以確保在模態視圖被解散時沒有任何內容保留模態視圖。在戰略位置添加一些NSLog語句,並查看對象ID以幫助查看發生了什麼。 – XJones

+0

我只是解僱它使用[self dismissModalViewControllerAnimated:YES]這是一個壞主意嗎?我知道蘋果有時候會有所不同。我沒有看到任何其他可能導致這種情況的事情......但我更新了我的代碼,介紹了我如何提出和解僱。 –

+0

你能發佈崩潰和堆棧跟蹤嗎? – XJones

回答

0

好吧,我想明白了,我的managedObjectContext沒有被保留,因爲我沒有使用self。所以,我通過這樣做來修復它:

// Core Data 
if (managedObjectContext == nil) { 
    self.managedObjectContext = [MyAppDelegate instance].managedObjectContext; 
} 
+0

我會重申你的答案。您的上下文沒有被保留B/C你沒有保留它,當你分配它。通過使用合成的setter(例如'self.managedObjectContext = ...'),它將被保留。還有其他方法可以確保您擁有有效的上下文。你可以用setter來手動保留它,或者你可以直接引用appDelegate上下文而不用將它存儲在iVar中。我添加了此評論(希望)可以幫助您理解問題和對象之間的關係。 – XJones

+0

我建議您查看XCode 4.2中提供的自動引用計數(ARC)。 ARC讓編譯器幾乎處理所有工作,確保對象保持/正確釋放。 – XJones

+0

我個人不喜歡使用ARC的想法,因爲我認爲它會導致成爲一個懶惰的程序員。不要試圖說別人是錯的,但那只是我的看法。 –

相關問題