2013-01-15 35 views
2

我已經帶回了NSCoder編碼的根對象,不知道如何管理這個返回的對象。我已經用autorelease池包圍了它,但該對象不會與池一起出去。 Code Here, See line 289行和代碼可能會隨着Git Hub提交而改變,但最終您會在工作代碼中看到答案,手指交叉。如何管理從NSCoder返回的解碼對象的內存?

時間:

什麼是保證完全導致解碼對象釋放的方式?

+0

什麼對象停留時間比您預期的要長?只要遵循通常的內存管理規則,您不應該擔心「導致釋放」。 –

+0

這個對象有很大數據量的潛力,我堅持我必須知道清除是至少迫在眉睫。 – cxx6xxc

回答

0

NSCoder不屬於該版本池。如寫入文件 -

+0

我把泳池拿出來了。那麼它現在是一個全球性的? – cxx6xxc

1

你管理內存從NSKeyedArchiver.

你要麼需要顯式地保留它,打電話的時候你做釋放,或立即使用它返回。

我建議重新熟悉自己與Memory Management Rules for Objective-C

手冊內存管理是在第一有點棘手,但一旦你的規則的竅門,它使象這樣的情況很容易合作,通過。

現在,如果您需要確保內存被立即刪除,您將需要編寫自己的二進制序列化程序,它將遵循alloc:init模式,因此調用程序顯式擁有內存。這樣當你調用對象釋放時,它將被釋放。

+0

它持續過去我的測試功能,沒有保留。當我無法控制至少啓動dealloc進程時,是不是認爲是泄漏? 275行:https://github.com/cxx6xxc/Node/blob/master/nodeInterface.m – cxx6xxc

+0

不,這不是泄漏。內部分配內存時,它將被添加到AutoRelease池中,當池被耗盡時,它將被釋放。 IIRC您無法控制自動釋放池何時耗盡,因爲它由操作系統管理。如果你想驗證,你可以手動調用對象的釋放,這會減少ref的數量,並且應該釋放內存(但是當AutoRelease池清空時會引入一個非常糟糕的錯誤 - 所以不要把它留下! !)。 – Alan

+0

它似乎行動不同於其他基礎autorelased實例。例如,如果立即自動釋放,NSString必須保留。儘管不保留NSCoder對象似乎並不重要,因爲它們仍然通過應用程序事件循環駐留在內存中幾次。對於測試,我發送了4條發佈消息,這意味着它的保留數爲4.稍後,我沒有得到關於應用程序關閉的典型over release分段,而如果我釋放autorelease NSString,我會。所以,我很困惑爲什麼NSCoder正在這樣做。它似乎並不一致。 – cxx6xxc