2014-02-17 154 views
0

我有以下代碼:內存管理ios7

- (IBAction)HeyCount:(UIButton *)sender { 
    NSString* strr = [[NSString alloc] initWithString:@"hi there"]; 
    self.string = @"789"; 
    ohYeah = @"456"; 
    NSLog(@"Retain Count of ohYeah:[%d] with String:[%ld]",[ohYeah retainCount],(long)[ohYeah integerValue]); 
    NSLog(@"Retain Count of strr:[%d] with String:[%ld]",[strr retainCount],(long)[strr integerValue]); 
} 

和OUT把上面的代碼是:

Retain Count of ohYeah:[-1] with String:[456] 

Retain Count of strr:[-1] with String:[0] 

ohYeah的聲明是在.h文件中

NSString * ohYeah; 

我沒有使用ARC。你們誰能解釋爲什麼retain countstrings-1並訪問retain count-1不應該崩潰的對象?

+3

不要使用保留計數 – Wain

+4

http://whentouseretaincount.com – datwelk

+0

我只使用保留計數來學習內存管理。 –

回答

3

我猜編譯器很聰明,並從您的給定代碼創建字符串文字。由於那些駐留在它們自己的內存空間中並且從未被釋放,所以它們得到UINT_MAX的保留計數。用%d打印的UINT_MAX將導致-1。使用%u作爲無符號整數。該retainCount聲明像這樣NSObject.h

+0

'保留Count of ohyeah:[4294967295]帶字符串:[456]''是當我使用'%u'而不是'%d'時的輸出 –

+0

這就是UINT_MAX,完全與OP預測的一樣 – jackslash

0

你不應該仔細看待retainCount。

有像常量字符串的對象不參與保留/釋放機制。例如,@「456」就是這樣一個常量字符串。您可以隨意釋放或保留它,不會發生任何事情。

還有其他一些對象,如@ 123,甚至不是64位系統中的對象。他們表現得像對象一樣,但沒有記憶被分配給他們。

在這兩種情況下,保留計數都不會給出任何明顯的結果。這就是爲什麼你應該看看保留數非常非常罕見。

然後有像「複製」這樣的方法有時會複製一個對象,有時候只是保留原始對象。因此,如果您有一個保留數爲100的對象,並且您創建了一個副本,則該副本的保留計數可能爲1或101.

0

注:

- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; 

您應該使用%u來顯示它在32位架構和%lu 64位。 但是你不應該直接使用retainCount,在你的代碼中使用它意味着你有一個架構問題,objective-c(ARC或手工引用計數)給出了一套完整的機制來正確管理內存和對象的生命週期。