Sar*_*gon 4 cocoa memory-management objective-c
我似乎永远无法释放我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;
}
Run Code Online (Sandbox Code Playgroud)
当然,如果我使用Analyze,它仍然告诉我,我在第二个上发布了一个已发布的对象release.
Scott的答案是正确的一般,但在这种特殊情况下,原因是NSString文字(即@"")是唯一的编译时常量,并且在保留和释放时根本不做任何事情.你将它赋值给NSMutableString*实际上并没有使它成为一个NSMutableString,所以你所写的相当于
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
Run Code Online (Sandbox Code Playgroud)
释放一个对象告诉运行时它可以破坏对象,至少就你所关注的而言,但它不要求立即销毁对象:在你的第一个之后[s release],Cocoa可以自由地做任何它喜欢的事情.以前用过的记忆s.它可能会将内存提供给下一个执行操作的对象alloc,在这种情况下,您以后的访问尝试s将导致火热的运行时崩溃...或者它可能不会立即需要该内存,在这种情况下,您可能无法访问已发布的内存宾语.
经验法则是"我释放了这个对象,这意味着它不再存在",而且"我已经释放了这个对象,这意味着它不再保证存在."