2012-12-29 54 views
1

我一直在爭取很長一段時間。我對Autorelease的理解是,當它不再需要它時,它會釋放它。NSManagedObjectContext autorelease問題

我得到了那些邪惡的EXC_BAD_ACCESS之一,沒有任何細節。 它只會崩潰上:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([Logix_AppDelegate  class])); 
    } 
} 

殭屍啓用我發現我是在一個循環 寫入CoreData這裏是我的的NSManagedObjectContext

NSManagedObjectContext *context = [[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext] autorelease]; 

任何想法初始化這裏....有很多代碼,所以我不想在這裏粘貼大量的東西。

回答

2

autorelease將一個對象添加到當前的自動釋放池中。噹噹前自動釋放池被銷燬時,該對象將收到release消息(並可能被釋放)。

發送autorelease到一個對象纔有意義,只有當你自己擁有那個對象。在你的情況下,managedObjectContext方法的名稱中沒有「new」,「alloc」或「copy」,所以你不擁有返回的對象,也不能在其上調用autorelease

你擁有的任何對象創建
您創建一個:

所以,你應該在「高級內存管理編程指南」替換該行通過

NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

參見Memory Management Policy對象使用名稱以「alloc」,「new」,「copy」或「mutableCopy」開頭的方法 (對於 示例,alloc,newObject,或mutableCopy)。 ...

當你不再需要它,你必須放棄對象的所有權您擁有
您可以通過發送一個release 消息或autorelease消息放棄對象的所有權。 ...

你一定不會放棄對象的所有權不屬於您

+0

我想我可能已經得到了coredata這段代碼從在線源...猜測是不是獲取代碼的最佳地點。我按照你說的方式做了,但是它造成了更多的錯誤。我將不得不深入挖掘。這是一個好的開始。這是任何人提供的autorelease的最佳解釋! – logixologist

+0

@logixologist:您是否可以選擇將項目遷移到ARC(自動引用計數)? ARC編譯器非常聰明,大部分保留/釋放問題都消失了。 (但它仍然有助於瞭解「幕後」發生了什麼。) –

+0

我認真思考了這個問題,但它太接近完成手動完成了,我不想冒險修復很多錯誤。您是否已經完成了ARC轉換,並且在事實之後需要完成多少工作。 – logixologist