使用NSString对象管理内存

Sah*_*ani 0 cocoa objective-c

这是我的主要方法:

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.无论releaseautorelease有效果-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.
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是为什么你甚至不应该看相对保留计数.自动释放不会影响保留计数.它的作用是将所有权转移到自动释放池. (8认同)

Jen*_*ton 8

如果转换UINT_MAX为有符号值,则为-1 .UINT_MAX是从未发布的对象的文档保留计数,其中包括字符串文字对象.

说到文档,我建议阅读有关retainCount通常无用的大框.