例如:我有一個視圖控制器並擺脫它。但是仍然有一個變量存儲着它的內存地址。在EXEC_BAD_ACCESS中訪問該結果。當然。但是:有沒有辦法檢查這個變量是否仍然有效?即如果它仍然指向內存中存在的東西?任何方式來檢查一個實例是否仍在內存中?
回答
您需要再次閱讀:
Cocoa Memory Management Guidelines
總之,如果你想要堅持你的東西必須retain
它。
如果你想要東西消失而你以前保留它,你必須release
或autorelease
它。
你絕不能呼叫dealloc
直接(除[super dealloc];
在您dealloc
方法的每一個的結束)。
你絕對不能release
或autorelease
,你沒有retain
的對象。
注意到一些方法做返回保留的對象,你必須release
。如果你是alloc
一個類的實例,那就意味着一個retain
。如果你copy
和實例,副本被保留。
如果您曾經嘗試使用retainCount
方法,請不要。這沒有用。僅將保留計數視爲增量;如果添加,則必須減去,但絕對值是應該忽略的實現細節。
(換句話說,即使有辦法明確檢查對象的有效性 - 有沒有 - 那將是錯誤的答案)
哦,使用建立與分析功能在Xcode。它在確定內存管理問題等方面做得非常好,但並不完美。
+1阿們,神甫。這是記憶管理的福音。 – 2010-02-25 20:25:53
如果變量,你指的是指向你的對象是否仍然引用有效的內存,則:
MyClass的* MYVARIABLE = [[MyClass的頁頭] INIT];東西
//噸發生......
如果(MYVARIABLE =零!) //做更多的東西
使用「NSZombieEnabled」中斷點。
由於這個原因,只有所有強烈建議我們使用訪問器。如果你的對象在任何地方被釋放,它將被賦值爲零,並且如果你調用了Nil對象上的任何API或方法,將沒有任何傷害。所以請養成使用Accessors的習慣。
您只需在構建設置中將此NSZombieEnabled標誌添加爲您的應用程序的參數即可。並啓用它。現在你在調試模式下運行你的應用程序。如果任何這樣的崩潰即將發生,這個斷點將告訴你哪個對象被釋放以及它在哪裏崩潰。
乾杯, Manjunath
- 1. 如何檢查一個Activity的多個實例是否存在
- 2. 是否有任何方法來檢查行中是否存在多列的值
- 3. 任何方式來檢查是否檢測到哈爾級聯?
- 4. 任何方式來檢查在after_filter操作是否成功?
- 5. 如何檢查一個ALAsset是否仍然存在使用URL
- 6. DirectoryInfo.LastWriteTime是一種安全的方式來檢查文件是否仍在上傳?
- 7. 任何方式來檢查每個表是否在MYSQL 5.5中設置innodb_file_per_table?
- 8. 任何方式來判斷Oracle導出是否仍在運行?
- 9. 使用普通測試來檢查實例是否存在
- 10. MSVC - 任何檢查函數是否實際內聯的方法?
- 11. Pandaic的方式來檢查一個數據幀是否有任何行
- 12. SQL函數來檢查表中任一列是否存在任何值
- 13. 任何方式來檢查郵件是否交付?
- 14. 檢查會話是否仍然存在
- 15. 檢查歌曲是否仍然存在
- 16. 如何檢查傳統ASP中是否存在對象實例?
- 17. 如何檢查SQL Server實例中是否存在憑據?
- 18. pythonic檢查方式是否存在?
- 19. 檢查一個方法的實例是否已經執行
- 20. 在每個控制器調用中是否存在一個鉤子來檢查用戶是否仍然有效?
- 21. 是否有可能在std ::可選w/o中放置一個實例來檢查/破壞前一個實例?
- 22. 檢查一個對象是否已經在Java中實例化
- 23. 檢查一個類是否已經在iOS中實例化了
- 24. 檢查NSString實例是否包含在一個NSArray中
- 25. 測試用例來檢查另一個字符串是否存在另一個
- 26. 檢查一個值是否存在於熊貓任何列的任何行中?
- 27. 是否有任何方法來檢查兩個標籤文本是否中斷?
- 28. 任何方式檢查瀏覽器中的Orbeon表單實例?
- 29. 如何檢查表中的任何一列中是否存在一個值sql
- 30. 檢查一個類型是否是Haskell中的Show實例?
如果你問純粹是爲了調試原因,請說清楚。正如其他人所說,如果您要求在您的應用中實際發生的事情,那麼這是一種糟糕的做法。 – Ken 2010-02-25 19:00:59