1

我有一個NSOperation的子類,它有managedObject作爲它的一個屬性。 我需要添加多個操作到nsoperationqueue &觀察他們的完成。 對於每個NSOperation實例,我創建一個新的託管對象作爲Apple文檔狀態「爲每個線程創建單獨的託管對象上下文並共享一個持久性存儲區協調器。」。 一旦第一個操作完成我獲得以下崩潰日誌核心數據+ NSOperationQueue

#0 0x34970c98 in objc_msgSend() 
#1 0x3608704e in -[_PFArray dealloc]() 
#2 0x36084b80 in -[_PFArray release]() 
#3 0x3179b1a0 in CFRelease() 
#4 0x3179deba in _CFAutoreleasePoolPop() 
#5 0x30d7bbb4 in NSPopAutoreleasePool() 
#6 0x30d91e1c in -[__NSOperationInternal start]() 
#7 0x30d91a7e in -[NSOperation start]() 
#8 0x30df7eca in ____startOperations_block_invoke_2() 
#9 0x33a248e6 in _dispatch_call_block_and_release() 
#10 0x33a1a532 in _dispatch_worker_thread2() 
#11 0x368bf590 in _pthread_wqthread() 
#12 0x368bfbc4 in start_wqthread() 

從日誌似乎有些對象越來越over-release.How我能得到哪些對象是過放? 應用程序與NSZombieEnabled一起運行,但僅收到以上信息。 做NsOperation維護自己的autorelease池嗎?

+0

難道是他們正在使用相同的'NSManagedObjectContext'是過度發佈? – Eimantas

回答

0

這裏有您的線索:

#7 0x30d91a7e in -[NSOperation start]() 

這是你在操作中釋放的東西。

#5 0x30d7bbb4 in NSPopAutoreleasePool() 

這是一個自動釋放的對象。這並不一定意味着你已經編寫了autorelease方法調用。由[NSString stringWithFormat:...]等便利方法創建的對象在返回之前會自動釋放。因此,請在您要調用autorelease的操作代碼中尋找一個地方,或者在沒有alloc-init模式的情況下創建一個對象。

是的,NSOperation維護自己的autorelease池。你不應該擔心這一點。如果你只是在你完成它們時才釋放對象,並且只有在方法範圍的末尾(或者如果返回它們時調用方法範圍)完成它們,那麼只有autorelease對象應該沒問題。

#2 0x36084b80 in -[_PFArray release]() 

它是一個對象存儲在一個數組(不是數組本身),它正在被過度發佈。

這種錯誤意味着你不是在釋放或自動釋放一個對象,或者當你不應該保留一個對象時。它可能是一個不正確的版本或不正確的autorelease,即使autorelease池發生錯誤。 autorelease可能是正確的,並且發佈可能不正確。無論哪種方式,當自動釋放池被耗盡時會發生錯誤,因爲這會在稍後發生。