为什么我的对象在无数次发布后仍能正常工作?

时间:2011-07-11 07:23:34

标签: objective-c cocoa memory-management

我似乎永远无法释放我的NSMutableString,如下所示。初始保留计数应该是1,但是在释放几次之后,字符串仍然可用,就像没有发生任何事情一样!

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSMutableString* s = [[NSString alloc]initWithString:@"AAA"];
    [s release];
    [s release];
    [s release];
    [s release];
    [s release];

    NSLog(@"%@",s);

    [pool drain];
    return 0;
}

当然,如果我使用Analyze,它仍会告诉我在第二个release上发布了一个已发布的对象。

2 个答案:

答案 0 :(得分:9)

Scott的回答是正确的一般,但在这种特殊情况下,原因是NSString文字(即@“”)是唯一的编译时常量,并且在保留和释放时根本不做任何事情。你将它赋值给NSMutableString *实际上并没有使它成为一个NSMutableString,所以你所写的相当于

[@"AAA" release];
[@"AAA" release];    
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];

答案 1 :(得分:8)

释放一个对象告诉运行时它可以销毁该对象,至少就你而言,但它不要求该对象是立即销毁:在您第一次[s release]之后,Cocoa可以随意使用s以前使用的内存做任何事情。它可能会将该内存提供给执行alloc的下一个对象,在这种情况下,稍后尝试访问s将导致火热的运行时崩溃...或者它可能不会立即需要该内存,在哪种情况下,您可以通过访问已发布的对象来逃避。

经验法则较少“我已经释放了这个对象,这意味着它不再存在”,而且“我已经释放了这个对象,这意味着它不再保证存在。”