2009-11-29 69 views
0

我是C++的15年資深人士,我認爲我可以輕鬆處理iPhone上的內存問題。但是我幾次都被這個新的環境所感染。這是我的問題。我希望我能正確地提出這個問題。appdelegate上的收藏得到了跺腳

基本上,我保持我的公共對象的可變數組在AppDelegate中。這似乎是維護多個不同視圖使用的對象集合的合理位置。但是,在創建視圖並將視圖推送到導航控制器的時間以及視圖開始使用這些值的時間之間,創建我的對象的內存中的位置被不同的值踩踏。

我回顧我的所有代碼,以確保引用計數是準確的,但沒有發現任何東西。所以我評論說所有的「釋放」電話,以保證對象仍然存在,但仍然繼續跺腳。

我的問題是這樣的...... 是否有事情發生,我需要知道什麼時候能得到踐踏我「推」,可能會導致我的記憶觀點?我有一個用戶按下的按鈕,將alloc-init一個viewcontroller,然後爲包含導航控制器做一個「pushViewController」。我在隨後的一行中驗證我的對象是否已創建並跟蹤內存。不幸的是,當按鈕事件展開爲「PurpleEventCallback」時,內存被踩踏。

這對任何人都有意義嗎?我的觀點發生了什麼事情,這並不是我所知道的,會導致我的記憶失效?

回答

1

歡迎來到SO!這聽起來像你做的一切正確。只要確保保留/釋放不會導致問題,請在再次按下視圖控制器之前再次保留您的陣列結構。請記住,一些構造函數返回保留計數爲1的對象,而另一些則返回保留計數爲零的自動釋放對象。通常,所有以「new」,「create」或「alloc」開頭的函數都會返回帶有+1保留計數的對象。其他便利功能(如[NSMutableArray arrayWithCapacity:][NSString stringWithFormat:])返回已被自動發佈且保留計數爲零的對象。如果你保留一個指向這些對象的指針,隨着運行循環清理,它們將隨機消失。

您可能還會考慮使用「殭屍」技術進行調試。當你開始隨機獲取EXE_BAD_ACCESS錯誤時,它非常有用。看看這個頁面以獲得更多信息:http://www.cocoadev.com/index.pl?NSZombieEnabled

從那篇文章中:「......啓用殭屍後,釋放對象的消息將不再以奇怪的方式行爲或以難以理解的方式崩潰,而是會記錄消息並以可預測的和調試器斷點的方式死亡,這是在追蹤過度版本和過早版本時使用的工具。「

希望有幫助!

+0

準確而言:以'alloc'或'new'開始或以'copy'開始的方法是唯一返回非自動釋放對象的方法。 – 2009-11-29 17:52:46

+0

對於NSZombieEnabled爲+1。作爲一名長期的C++開發人員,我真的需要閱讀Cocoa的內存管理編程指南,特別關注所有權。 http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html – 2009-11-29 18:10:54

+0

在這裏,我認爲我很聰明,通過設置我的原始數組大小和創建飛行中的字符串。我不知道他們是autoreleased。我回去發現了一些需要讓他們的參考數字出現偏差的差異。謝謝! Marcus – 2009-12-08 18:37:51

0

您可能沒有閱讀過可可自動發佈池的概念。自動釋放對象會將對象的釋放推遲到當前事件的結束時(或者當釋放自動釋放池時)。

要檢查自動釋放是否是您的問題,請將環境變量NSEnableAutoreleasePool設置爲"NO"。如果問題消失,autorelease是你的問題。

+0

當它!我以爲我已經評論過所有可能會減少我的對象的路徑,以查看是否是這個問題。在閱讀你的兩個回覆之後,我回過頭去,發現我錯過了一個「autorelease」。這是我的另一個問題(除了之前的評論)。我們在C++中沒有這些,所以它會稍微習慣這裏。 謝謝你們! Marcus – 2009-12-08 18:38:43