以下是我的主要方法:
int main (int argc, const char * argv[]) {
NSString *string=[[NSString alloc]init];
NSLog(@"%@ The retain count is:%d", string, [string retainCount]);
NSLog(@"Hello, World!");
return 0;
}
执行这段代码时的输出是“保留计数为:-1” 我期待它给我1作为保留计数,因为我使用alloc创建了对象。 当我尝试保留或释放NSString对象时,我遇到了类似的问题。
当我尝试使用NSArray时,我在创建对象后立即获得保留计数为2.我不明白对象如何被处理的机制。 请解释! 提前谢谢..
答案 0 :(得分:14)
您不应该关注原始保留计数值,因为根据各种不同,这可能是不同的值。例如,在第一行中,您将分配相当于@""
的内容,即空字符串。这是由一个无法解除分配的对象优化的,并且只要您“分配”它就会共享。对于所有静态字符串也是如此,例如查看[@"Hello" retainCount]
返回的值。
相反,您应该专注于相对保留计数。也就是说,保留计数是增加(+1
),是保持不变(+0
)还是减少(-1
)。您始终需要确保这些相对值总和为0.
一个例子:
Foo *foo = [[Foo alloc] init];
[foo retain];
[foo release];
[foo autorelease];
alloc
方法返回+1
的对象,retain
也将计数递增1.因此,在第2行的末尾,我们位于+2
。 release
和autorelease
都会产生-1
的效果,所以在第4行的末尾,你处于+0
,一切都很好。
有一些简单的规则:如果方法名称为alloc
,则以copy
或create
开头,然后您将获得一个保留计数为+1
的对象。所有其他方法(尤其是以get
开头的方法)应返回具有保留计数+0
的对象。如果您的方法需要创建一个对象,但其名称暗示应该返回一个+0
对象,您可以这样做:
- (Foo *) bar {
Foo *result = [[Foo alloc] init]; // +1
return [result autorelease]; // -1
// Object lives until the autorelease pool is drained,
// but relative retain count is +0.
}
答案 1 :(得分:8)
-1是将UINT_MAX
转换为有符号值时获得的结果。 UINT_MAX
是永久释放的对象的文档保留计数,包括字符串文字对象。
说到the documentation,我建议您阅读有关retainCount通常无用的大框。