2010-07-28 28 views
0

我被告知不用擔心保留數量。我知道我不應該使用基於retainCount的條件邏輯來決定使用release還是retain,但是我不應該擔心它嗎?我認爲這些以某種方式對應於內存使用情況。不要擔心`retainCount`?真?

舉例來說,如果我有一堆的UIView子視圖,我也已經投入了NSArray能夠通過他們迭代的,那豈不是保留計數,因此內存使用的應用?如果是這樣,如果子視圖是500 UIControl實例,這是昂貴的還是微不足道的? 這是假設我需要500個實例,當然。

回答

6

您不應該擔心retainCount,因爲它通常是引用計數系統的誤導實現細節。你應該關心的是遵循適當的對象所有權策略。

我從蘋果公司的文檔偶爾張貼此:

重要:此方法在調試內存管理問題沒有價值的典型。因爲任何數量的框架對象都可能保留了一個對象以保存對它的引用,同時autorelease池可能在對象上保存了任意數量的延遲發佈,所以很難從此獲得有用的信息方法。

至於你的最後一個問題,你的內存使用量不會從添加對象從一個數組到另一個數組。保留計數只是對象中的一個無符號整數,當某些東西聲明對它的所有權時,該整數會加1。但是,不要再擔心這一點。

+0

謝謝,這對我很有用。並倍加感謝不要重申正確的對象所有權政策,這是我心中所知的。 – 2010-07-28 18:28:42

1

保留數只是一個數字。保留計數達到零的對象將被釋放;除此之外,如果保留一次或五十次都沒關係。

+2

所以你說的是一個對象是分配還是不分配,這是唯一導致內存佔用差異的東西?這裏推斷... – 2010-07-28 16:08:59

+2

@Yar:這正是他所說的。 – JeremyP 2010-07-28 16:46:00

+0

感謝@JeremyP +1。 – 2010-07-28 18:30:27

2

他們說不用擔心的原因是retainCount字段通常會非常具有誤導性。除了不知道自動釋放池何時上次被刷新或自動釋放了多少次,還有一些複雜的內部事件,並且系統組件可能暫時以無法預測的方式保存引用。因此,如果您開始學習retainCount,您可能會花費大量時間來弄清楚系統中的其他部分如何處理各種對象,這不可能幫助您正確地獲得應用程序。

您應該設計應用程序的工作方式,以便內存使用不會過多。

您應該擔心內存中有多少物品,以及您保留了多少次(這是一個小於retainCount的數字),並確保您釋放它們的次數與保留次數相同他們。

多次調用對象上的保留仍然只會導致對象在內存中的單個副本。

要檢查內存使用情況和/或泄漏情況,請使用儀器泄漏檢測器。

5

舉例來說,如果我有一堆的UIView子視圖,我也已經投入到一個NSArray能夠通過他們迭代的,那豈不是雙重保留計數......

是的,它會的。

...因此內存使用的應用程序?

不!結論是錯誤的。當存儲爲32位整數時,1000000佔用的空間與0相同。

+0

太棒了,這有很大的幫助。 – 2010-07-28 16:08:17

7

retainCount返回的值是該對象被保留的絕對次數。 A UIView來自其實現不透明的框架。實現細節不是你應該擔心的事情,除了你與之交互的文檔化界面。

在該實現中,作爲實現的一部分,UIView的實例可以保留任意次數。在記憶方面,保留的實際數量是毫無意義的; 1與5相同。

您應該關心的唯一事情是代碼如何更改對象的保留計數

如果您的代碼增加了保留計數,它必須在某處將其減少,否則對象將永遠保持。如果你retain,你必須release(或autorelease)。如果您copy,則必須爲releaseautorelease。如果您要newalloc,則必須爲release(或autorelease)。

就是這樣。