2

例如:我有一個視圖控制器並擺脫它。但是仍然有一個變量存儲着它的內存地址。在EXEC_BAD_ACCESS中訪問該結果。當然。但是:有沒有辦法檢查這個變量是否仍然有效?即如果它仍然指向內存中存在的東西?任何方式來檢查一個實例是否仍在內存中?

+0

如果你問純粹是爲了調試原因,請說清楚。正如其他人所說,如果您要求在您的應用中實際發生的事情,那麼這是一種糟糕的做法。 – Ken 2010-02-25 19:00:59

回答

18

您需要再次閱讀:

Cocoa Memory Management Guidelines

總之,如果你想要堅持你的東西必須retain它。

如果你想要東西消失而你以前保留它,你必須releaseautorelease它。

絕不能呼叫dealloc直接(除[super dealloc];在您dealloc方法的每一個的結束)。

絕對不能releaseautorelease,你沒有retain的對象。

注意到一些方法返回保留的對象,你必須release。如果你是alloc一個類的實例,那就意味着一個retain。如果你copy和實例,副本被保留。

如果您曾經嘗試使用retainCount方法,請不要。這沒有用。僅將保留計數視爲增量;如果添加,則必須減去,但絕對值是應該忽略的實現細節。

(換句話說,即使有辦法明確檢查對象的有效性 - 有沒有 - 那將是錯誤的答案)

哦,使用建立與分析功能在Xcode。它在確定內存管理問題等方面做得非常好,但並不完美。

+0

+1阿們,神甫。這是記憶管理的福音。 – 2010-02-25 20:25:53

2

這就是整個內存管理模型的設置 - 如果您在正確的時間調用retain,在合適的時間調用releaseautorelease,那是不可能發生的。您可以使用NSZombie來幫助您進行調試。

+0

是的,你不應該檢查這種情況,你應該確保當你需要時保留這些對象,當你不需要時釋放它們。 – Bearddo 2010-02-25 18:53:49

0

如果變量,你指的是指向你的對象是否仍然引用有效的內存,則:

MyClass的* MYVARIABLE = [[MyClass的頁頭] INIT];東西

//噸發生......

如果(MYVARIABLE =零!) //做更多的東西

1

使用「NSZombieEnabled」中斷點。

由於這個原因,只有所有強烈建議我們使用訪問器。如果你的對象在任何地方被釋放,它將被賦值爲零,並且如果你調用了Nil對象上的任何API或方法,將沒有任何傷害。所以請養成使用Accessors的習慣。

您只需在構建設置中將此NSZombieEnabled標誌添加爲您的應用程序的參數即可。並啓用它。現在你在調試模式下運行你的應用程序。如果任何這樣的崩潰即將發生,這個斷點將告訴你哪個對象被釋放以及它在哪裏崩潰。

乾杯, Manjunath

相關問題