我有以下代码:
- (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 of strings是-1,而使用retain count -1访问对象不应该崩溃吗?
发布于 2014-02-17 12:33:17
我想编译器是聪明的,并从给定的代码中创建字符串文本。因为它们驻留在自己的内存空间中,并且从未被释放,所以它们得到了UINT_MAX的保留计数。使用%d打印的UINT_MAX将导致-1。对无符号整数使用%u。
发布于 2014-02-17 12:29:21
您不应该密切关注retainCount。
有些对象,如常量字符串,不参与保留/释放机制。例如,@"456“是这样一个常量字符串。你可以随心所欲地释放或保留它,什么都不会发生。
还有其他像@123这样的对象,它们甚至不是64位系统中的对象。它们的行为就像对象,但是从来没有为它们分配过内存。
在这两种情况下,保留数都不会给出任何合理的结果。这就是为什么你非常非常罕见地看到保留数。
还有一些方法,比如“复制”,有时复制一个对象,有时只保留原来的对象。因此,如果您有一个对象,其保留计数为100,并且您复制了一个副本,则该副本的保留计数可能为1或101。
发布于 2014-02-17 12:37:16
注意,retainCount在NSObject.h中是这样声明的
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;您应该使用%u在32位架构上显示它,在64位上使用%lu。但是您不应该直接使用retainCount,在代码中使用它意味着您有一个体系结构问题,目标-c (ARC或手动参考计数)提供了一套完整的机制来正确管理内存和对象生命周期。
https://stackoverflow.com/questions/21829047
复制相似问题