2014-02-17 39 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或手工引用计数)给出了一套完整的机制来正确管理内存和对象的生命周期。