内存管理ios7

时间:2014-02-17 12:24:08

标签: objective-c ios7 retaincount

我有以下代码:

- (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]);
}

以上代码的输出是:

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

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

ohYeah的声明在.h文件中

NSString * ohYeah;

我没有使用ARC。你们中的任何人都可以解释为什么retain count strings -1retain count并且-1 {{1}}访问对象不应该崩溃?

3 个答案:

答案 0 :(得分:3)

我猜编译器很聪明,并根据给定的代码创建字符串文字。由于它们驻留在自己的内存空间中并且从未被释放,因此它们的保留计数为UINT_MAX。用%d打印的UINT_MAX将导致-1。使用%u表示无符号整数。

答案 1 :(得分:0)

你不应该密切关注retainCount。

有些常量字符串之类的对象不参与保留/释放机制。例如,@“456”就是这样一个常量字符串。您可以随意发布或保留它,不会发生任何事情。

还有其他对象,如@ 123,在64位系统中甚至不是对象。它们表现得像对象,但没有为它们分配任何内存。

在这两种情况下,保留计数都不会给出任何明智的结果。这就是为什么你应该看看保留计数非常非常罕见的原因。

然后有像“复制”这样的方法有时复制一个对象,有时只保留原始对象。因此,如果您有一个保留计数为100的对象,并且您复制了该副本,则该副本的保留计数可能为1或101.

答案 2 :(得分:0)

请注意,retainCount在NSObject.h

中声明如下
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

您应该使用%u在32位架构上显示它,在64位上显示%lu。 但是你不应该直接使用retainCount,在你的代码中使用它意味着你有一个架构问题,objective-c(ARC或手动引用计数)给出了一套完整的机制来管理内存和对象的生命周期。< / p>