使用NSString对象管理内存

时间:2011-01-20 11:58:49

标签: objective-c cocoa

以下是我的主要方法:

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.我不明白对象如何被处理的机制。 请解释! 提前谢谢..

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行的末尾,我们位于+2releaseautorelease都会产生-1的效果,所以在第4行的末尾,你处于+0,一切都很好。

有一些简单的规则:如果方法名称为alloc,则以copycreate开头,然后您将获得一个保留计数为+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通常无用的大框。