2013-02-16 295 views
1

我有屬性:爲什麼retainCount返回2

@property(nonatomic, retain) NSMutableArray *myvar; 

第一種情況:

myvar = [[NSMutableArray alloc] init]; 
    NSLog(@retainCount: %i:", [myvar retainCount]); 

輸出:

retainCount:1

第二種情況:

self.myvar = [[NSMutableArray alloc] init]; 
    NSLog(@retainCount: %i:", [self.myvar retainCount]); 

輸出:

retainCount:2

我的問題是:爲什麼在第二情況保留值是2?

+0

[爲什麼要保留計數爲負值?](http://stackoverflow.com/questions/14601270/why-retain-count-in-negative-value)和[this](http:// stackoverflow .com/questions/12418230/why-is-the-retain-count-of-equal-to-7-8-or-10),[this this too](http://stackoverflow.com/questions)/12883616/ios-reference-counting)和[this one以及](http://stackoverflow.com/questions/14043994/ios-memory-management-clarifications)。 – 2013-02-16 16:51:01

+0

這裏有很多關於爲什麼不使用保留計數來進行內存管理的問題。這裏有一個鏈接可以解釋它。 http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ – 2013-02-16 16:57:03

回答

4

+1,因爲你alloc/init倒是它
+1因爲self.myvar保留它(載於你的財產申報)

如果你autorelease分配/初始化後,它會回落到1 .. 。那麼如果你設置self.myvar爲零,它將會達到0(如果在此期間沒有其他東西保留它)

但是正如vikingosegundo所說的,你不希望弄亂保留計數。操作系統決定何時將它們擊倒,所以不能將它們用作可靠的狀態量度。

+0

我沒有注意到self.myvar是完全不同於myvar的東西。謝謝! – przemeko 2013-02-16 22:05:03

8

唯一有效的答案:永不檢查,使用,信任retainCount。它不是用於調試或直接用於內存管理。

有用:http://www.whentouseretaincount.com

但在你的情況:當你不使用ARC(否則編譯難道不使您可以使用retainCount反正)你超過固定。

它保留在這裏@property(nonatomic, retain) NSMutableArray *myvar;

這裏:self.myvar = [[NSMutableArray alloc] init];

做:

self.myvar = [[[NSMutableArray alloc] init] autorelease]; //will release once soon 

我最喜歡的,作爲獨立於ARC/MRC和短

self.myvar = [NSMutableArray array]; // identical to the first example 

或更多expli CIT

NSMutableArray *var = [[NSMutableArray alloc] init]; 
self.myvar = var; 
[var release]; 
+0

@ H2CO3,你是對的。 – vikingosegundo 2013-02-16 16:55:46

+1

現在很好,+1。 – 2013-02-16 16:56:07

+0

我總是使用方便的方法。 – vikingosegundo 2013-02-16 16:56:51

1

下面是我經常去的ARC出現之前的規則:

「的緝毒特警規則」:

如果使用NewAllocRetainCopy,加一計數。

在第二種情況下,您的保留數爲2,因爲您正在使用該類的實例屬性(使用self關鍵字)使用allocretain。在另一種情況下,您不使用合成設置器來設置變量,因此不使用retain。探索增加理解的實際屬性。

vikingosegundo已經很好地解釋了在他的回答中做事的正確方法。

希望有幫助!

相關問題