我有以下代码:
- (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
-1
为retain count
并且-1
{{1}}访问对象不应该崩溃?
答案 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>