这是我的主要方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
执行这段代码时的输出是"保留计数为:-1".
我期待它给我1作为保留计数,因为我使用alloc创建了对象.当我尝试保留或释放NSString对象时,我遇到类似的问题.
当我尝试使用NSArray时,我在创建对象后立即得到保留计数为2.我不明白对象如何被处理的机制.请解释!提前致谢..
Dar*_*ust 14
您不应该关注原始保留计数值,因为这可能是一个不同的值,具体取决于各种事物.例如,在第一行中,您将分配相当于@""空字符串的内容.这是由一个无法解除分配的对象优化的,并且只要您"分配"它就会共享.所有静态字符串都是如此,例如查看返回的值[@"Hello" retainCount].
相反,你应该关注相对保留计数.也就是说,保留计数是增加(+1),它是保持不变(+0)还是减少(-1).您始终需要确保这些相对值总和为0.
一个例子:
Foo *foo = [[Foo alloc] init];
[foo retain];
[foo release];
[foo autorelease];
Run Code Online (Sandbox Code Playgroud)
该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.
}
Run Code Online (Sandbox Code Playgroud)