2011-08-23 110 views
1

我一直在測試Objective-C的不同特性,並且涉及了內存管理的主題。顯然,在閱讀少量文檔時,爲了構建功能良好的應用程序,內存管理似乎非常嚴格。內存管理困境,目標-C

現在據我的理解,當我們分配一個內存對象的retainCount將變成。但我寫的東西是爲了學習的目的,它給我的異常retainCount

這可能是不正常的數字對我來說,但是誰知道在引擎蓋下,誰能解釋我是如何得到這retainCount什麼將是最好的方式釋放它。它具有異常retainCount

代碼,

對象名稱是:...(UISlider *) greenSender...

-(IBAction) changeGreen:(UISlider *)greenSender{ 
    showHere.textColor = [UIColor colorWithRed:red.value green:greenSender.value blue:blue.value alpha:1.0]; 
    NSLog(@"retainCount %d",[greenSender retainCount]); 
} 

reatainCount,只是執行我的代碼之後。

enter image description here

的簡短解釋會給我一個提示,以及外部的閱讀資源,將不勝感激。 謝謝

+1

綠髮送者來自其他地方。要確定你的保留計數器來自哪裏,我們需要該指針的其餘用途。 – mydogisbox

+0

對不起,這只是一個UISlider,傳遞給方法的參數,它是在墨爾本1:27上午...道歉。 – doNotCheckMyBlog

+1

如果我不得不猜測,我會說greenSender是你的UI的一部分,所以UI組件會引用你的對象,因此保留計數爲8. – mydogisbox

回答

5

不要依靠保留計數。它們只能用作調試工具。原因是如果一個對象獲得retain ed和autorelease d,其有效保留計數沒有變化,但其保留計數的實際增加了一個。在自動釋放池消耗的情況下,未來某個時間將爲release d。因此,您不能依靠保留計數來了解對象是否已正確管理。

大的保留計數如8可能表示編程錯誤(例如保留太多次),但它也可能只是一個標誌,它已經是大數目次的retain ed和autorelease,雖然好奇,但可能是完全有效的。

+0

有時候某些東西看起來非常有用,但可憐的程序員,我可能會用我自己的大腦以計算我通過或保留任何特定對象的次數:),謝謝 – doNotCheckMyBlog

+3

你並不是真的想自己計算這些東西......它不會幫助你調試任何東西。最好通過確保符合內存管理約定來追蹤錯誤。如果您需要工具來幫助調試內存問題,請查看NSZombies和Instruments。 –

+0

謝謝克里斯,讓我谷歌這些殭屍,這是非常奇怪的經驗,直接在java後編程Obj-C。 – doNotCheckMyBlog

5

不要信任/依靠retainCount。真。

從蘋果:

重要:這種方法通常是在調試 內存管理問題沒有價值的。因爲任何數量的框架對象可能保留一個對象以保存對其的引用,而在 時,同一時間自動釋放池可能在對象上保存任意數量的延遲 版本,因此很難獲得有用的 來自此方法的信息。

+0

多數民衆贊成在相當有趣,感謝吉洛克1+的努力,但我不得不接受亞當的答案,因爲他先說,謝謝 – doNotCheckMyBlog

+1

@krio沒問題,亞當太快了:) – Jilouc