2012-02-22 95 views
-1

你好傢伙我有一個關於以下問題的問題。保留使用(保留)財產時的行爲

我有兩個對象:aClass和bClass。 aClass應通過使用retain屬性來包含bClass。 在instanciating bClass之後(我在這裏沒有使用便捷分配器,因爲我想解決我在這裏的錯誤理解問題),通過使用aClass的setProperty將bClass分配給aClass。

在整個過程中,我通過詢問引用並詢問aClass的屬性來檢查bClass的retainCount。

據我瞭解,目標C的內存管理,所提到的保留計數應該是相同的,因爲我共享屬性和引用之間的對象的所有權。

在我看來,我在理解內存管理方面存在一個主要問題。也許有人可以向我解釋我的錯誤。 Thx提前。

Header of ClassA 

@property (retain)ClassB *myProperty; 


Source of ClassA 

@implementation ClassA 
-(id)init { 

self = [super init]; 

if (self) { 
    ClassB * bClass = [[ClassB alloc] init]; 
    NSLog(@"Temporary bClass retain count = %d", [bClass retainCount]); 

    self.myProperty = bClass; 
    NSLog(@"retain count after giving ownership to ClassA = %d", [bClass retainCount]); 

    [bClass release]; 
    NSLog(@"retain count of bClass after release = %d", [bClass retainCount]); 
    NSLog(@"retain count of myProperty of ClassA = %d", [self.myProperty retainCount]); 
} 
return self; 
} 

的輸出是:

臨時bClass保留計數= 1

給予所有權ClassA的= 2

釋放後保留bClass的計數後保留計數= 1

保留ClassA的myProperty的數量= 2

+0

不要使用-retainCount這是沒有用的。http://stackoverflow.com/questions/4636146/when-to-use-retaincount – newacct 2012-07-06 01:20:34

回答

2

保留並釋放對象實例。指向對象實例的指針不是對象,它們本身不會被保留或釋放。

您首先有一個名爲bClass的指針指向BCLass的實例。當您調用init時,該實例將保留。 (保留計數= +1)

然後,通過屬性setter setMyProperty指定另一個指針。由於該屬性與retsain屬性進行了合併,因此BClass的實例會再次保留。 (保留計數= +2)

接下來,您調用由bClass指向的BClass實例的發佈。 (這是與myProperty屬性指向的BClass相同的實例。(現在保留Count = +1。)

不使用非原子屬性的效果可以從文檔中可以看出:

屬性是默認原子,使得合成的訪問器提供在多線程環境 - 即魯棒訪問屬性 ,所述從getter返回的值或通過setter設置的值是 總是完全檢索或設置,而不管其他線程是否同時執行。

如果指定強勁,複製或保存並且不指定非原子,然後在引用計數 環境中,一個對象的屬性合成get訪問使用了鎖,並保留和 自動釋放返回值,實施將類似於以下內容:

[_internal lock]; // lock using an object-level lock 

id result = [[value retain] autorelease]; 

[_internal unlock]; 

return result; 

所以看起來你記錄語句引用屬性,它保留了對象(保留= +2),並把它放入自動釋放池。 (發佈將在稍後發佈

所有權僅僅意味着承擔責任,告知該對象在發佈時不再需要該對象。Takiing擁有權通過保留對象實例完成(使用New ,初始化,保留或複製)

+0

非常感謝,這幫了很大的忙! – user1214249 2012-02-23 09:18:26

+0

「調用init時保留該實例」調用'alloc'時實際保留該實例。 'init'在概念上並沒有改變保留計數 – newacct 2012-07-06 01:18:44

2

retainCount沒用。別叫它。

特別是,它永遠不會反映一個對象是否已被自動釋放,並且在調用getter方法時將保留/ autorelease對象。

+0

沒有屬性使用(保留)autorelease一個對象,以防對應的getter被調用嗎?我認爲這與原子沒有任何關係 我可以假設我對該屬性的使用是正確的嗎?儘管我使用了retainCount。 – user1214249 2012-02-22 19:23:37

+0

這是一個執行部分IL;原子屬性將保留/ autorelease get,非原子不會。而且,是的,在這個例子中使用bClass不會泄漏。 – bbum 2012-02-22 21:08:11

+0

@ user1214249:如果感覺像這樣,屬性getter/setter可以保留並自動釋放5次。你不能依賴它。添加retain/autorelease從不會降低代碼的正確性。所以任何功能都可以隨心所欲地使用它,因爲它非常謹慎。 – newacct 2012-07-06 01:27:31

1

所有你需要記住的是如果你分配它,複製它或新的它,那麼你正在獲得一個對象的所有權,你需要釋放它。我不會擔心retainCount的價值。