2011-11-02 63 views
0

我注意到在將我的Xcode更新爲4.2後,retainCount總是等於-1。我沒有在我的項目中使用ARC,我甚至嘗試創建新的項目和切換ARC選項,在項目設置,但下一行關閉工作真的很奇怪:XCode 4.2中的retainCount發生了什麼?

NSString *string = [[NSString alloc] init]; 
NSLog(@"%i", [string retainCount]); //-1 
[string retain]; 
[string retain]; 
[string retain]; 
NSLog(@"%i", [string retainCount]); //still -1 
[string release]; 
[string release]; 
[string release]; 
NSLog(@"%i", [string retainCount]); //still -1 

難道我錯過了什麼?我認爲,如果ARC選項關閉,項目將像以前一樣工作..

+0

%d? 'NSLog(@「%d,[string retainCount]);' – beryllium

+3

無論發生什麼事情,它都不是一個有用的方法,並且真的沒有理由使用它。 – FeifanZ

+1

@beryllium - 不,'-retainCount'返回一個NSUInteger。嘗試將其格式化爲浮點數應該會導致LLVM下的編譯器錯誤,否則就會導致垃圾結果。無論如何,這只是[另一個不使用'-retainCount'的原因] http://stackoverflow.com/questions/4636146/when-to-use-retaincount/4636477#4636477)我很高興ARC把它變成編譯器錯誤 –

回答

6

首先,我要說,如果你打電話給retainCount,你可能做錯了什麼。這種方法只能由編寫底層框架代碼的人使用,甚至只能在調試時使用。對象可能會被保留,並在背後自動釋放,以致致電-retainCount非常具有誤導性。

無論如何,我懷疑答案是[[NSString alloc] init]正在返回一個單例對象。它是不可變的,而且是空的,所以當它只能返回@""時,沒有理由爲它創建一個全新的字符串。

+2

解釋是正確的,但我不同意retainCount:它根本不應該被調用,它應該已經被刪除了很長時間時間前。 – Sven

+0

@SvenWeidauer:除非你在蘋果公司,你可能不會編寫低級框架代碼。 –

+0

我同意你們,我從來沒有在我的產品中使用過retainCount,但我想看看內存管理如何與塊 – gN0Me