2011-12-07 36 views
1

我對Cocoa/Objective-C還很新,所以我希望我能解釋我的問題。
我在Xcode 4.2中創建了一個垃圾收集應用程序我有我的應用程序委託創建一個Authorize對象(我的類)該對象將創建並呈現一個Password對象(我的類/ xib)。可可垃圾收集和保留週期

密碼窗口接受輸入並批准或拒絕並關閉。從那裏,Authorize對象將關閉並控制返回到應用程序委託。當密碼筆尖呈現爲模式窗口時。

作爲一個測試,我包括一個NSLog語句,當每個對象被初始化和它的最終化。出於某種原因,我的密碼對象沒有被最終確定。授權對象已完成。

我甚至取消了Authorize對象,並直接從應用程序委託創建了密碼 - 仍然沒有最終確定。

我研究並嘗試了一切/我可以想到的任何事情來獲取此對象來完成(我假設它不釋放這個對象的內存,如果它沒有最終確定)。
任何人都可以提出一些我可能忽略的東西嗎?

更新:
更多經過試驗,我發現這個問題。我創建了一個只有AppDelegate和WindowController/Nib文件的新項目。使用與GC和構建相同的設置,我能夠消除所有事情,直到找到問題。
我在我的密碼筆尖中有一個NSSecureTextfield。無論出於何種原因,當窗戶關閉時都不會釋放。
在關閉窗口並調用了finalize方法之前,我添加了行[textField removeFromSuperview]。
我不確定這是否是最好的方法,但似乎可行。

對於ARC選項,我的印象是項目需要以10.7或更高爲目標來使用ARC。我希望將10.5作爲最低目標。
也許我錯了。如果我是,請讓我知道。

+0

ARC確實需要10.7。 –

回答

0

如果finalize沒有被調用,那麼要麼你仍然有很強的參考,要麼GC沒有運行。由於其他對象完成,顯然GC正在運行。所以你將不得不尋找誰是一個強有力的參考。審覈您的代碼,將每個有Password類型變量的人作爲開始。確保它沒有卡在某個字典或數組中。確保它沒有被視圖控制器或尚未消失的視圖保存。

並且儘可能切換到ARC而不是GC。這可能會完全一樣,但其他一切都會好得多。 GC是我們許多人忽視的一個有趣的實驗,但ARC絕對是該平臺的領導者。

0

關於(更新)這部分的質詢:

對於ARC的選擇,我的印象是,該項目將需要爲目標10.7或更高版本才能使用ARC。我希望將10.5作爲最低目標。 也許我錯了。如果我是,請讓我知道。

您可以針對64位雪豹或更高版本使用ARC,但如果你不能使用歸零弱引用 - 改用分配屬性,如果你想去這個標記任何顯式聲明的ivars爲__unsafe_unretained路線。 (關於this question的更多信息。)