2011-04-12 68 views
5

何時調用dealloc方法?我發現(在很多例子中),很多NS變量都是在實例化的方法中發佈的,但是當合成一個組件時,他們會將發佈放在dealloc方法中。何時調用dealloc方法?

回答

10

Apple reference文檔清楚地指出 對接收者的後續消息可能會生成一個錯誤,指示消息已發送到解除分配的對象(假設解除分配的內存尚未被重新使用)。

你從來沒有直接發送dealloc的消息。取而代之的是,對象的dealloc方法是通過釋放NSObject的協議方法調用間接(如果該釋放消息中接收器的保留計數成爲0的結果)。見內存管理編程指南在使用這些方法的詳細信息。

子類必須實現自己的dealloc的版本允許通過重新分配的對象所擁有的用於數據動態分配存儲或對象,例如對象的實例變量消耗任何額外的內存釋放。執行類特定的解除分配之後,子類方法應該通過消息合併的dealloc的超類版本超級:

重要:注意的是,當應用程序終止,對象可能無法發送自一個的dealloc 消息該進程的內存在退出時自動清除 - 它更有效率,因爲它只是允許操作系統清理資源,而不是調用所有內存管理方法。對於這樣那樣的原因,你不應該在 的dealloc

管理稀缺資源的基礎上,你實際上創造或保留的對象的範圍另一個SO問題iPhone - when is dealloc for a viewcontroller called?

0

當您加載nib文件時,必須有一個所有者,它是存在於應用程序中的一個 對象。如果在 界面構建器中打開nib文件,則會看到一個代理圖標,代表nib文件的所有者 。您可以建立連接,但連接 尚未建立,直到加載了nib文件並指定了onwer的真實身份。

無論如何,你可以有一個插座(例如i-var)連接到nib文件中頂層 級別的UI對象,通常是窗口。當您加載 nib文件並指定i-var現在將指向 UI對象的所有者時。假設這是一個窗口。最終,當您決定去掉UI對象時,您只需釋放所有者,並且如果 的保留計數爲零,則會調用dealloc方法。 然後,所有者的dealloc方法應釋放它的i-vars (實例變量)。我們假設你連接到 的i-var窗口被稱爲window。那麼你應該有這樣的東西:這個:

- (void)dealloc {window release]; [super dealloc]; }

這應該會導致窗口達到零計數。然後 該窗口的dealloc應該被調用,並且隨後 將發佈子視圖上的所有保留,並且子視圖將達到 保留計數爲零,並且隨後將在其子視圖上釋放所有 保留,等等,直到所有是交易。

自從我做了AppKit(Cocoa)編程以來,這已經有一段時間了,但我認爲 這仍然是正確的。

Omni有一個叫做OmniObjectAlloc的應用程序,或者類似於 的應用程序,它應該在查看你的應用程序時非常有幫助,並且確定是否所有事情都得到處理。我使用NeXT/Apple的ObjectAlloc ,但我不知道他們是否仍提供它。尋找 它,我會想象它仍然存在。

-1

它。 每當retaincount回到1時,dealloc方法將被自己調用。 這隻適用於MRC,不適用於ARC。

一個很好的注意事項是跟蹤您創建的對象,讓它在您的實現中不泄漏。

+0

當保留計數減少到0時,會調用'dealloc'。因爲將RC遞減到0將毫無意義,這是沒有做到的。但是當「剩餘量回到1」時,這個對象仍然非常活躍。 – bbum 2016-09-03 15:30:01

相關問題