Objective c 为什么我的对象在无数次发布后仍然有效?
我似乎永远无法释放我的Objective c 为什么我的对象在无数次发布后仍然有效?,objective-c,cocoa,memory-management,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
,如下所示。初始保留计数应为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;
}
#导入
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
//在这里插入代码。。。
NSMutableString*s=[[NSString alloc]initWithString:@“AAA”];
[s释放];
[s释放];
[s释放];
[s释放];
[s释放];
NSLog(@“%@”,s);
[泳池排水沟];
返回0;
}
当然,如果我使用Analyze,它仍然会告诉我,我在第二次发布时释放了一个已发布的对象。发布一个对象会告诉运行时它可以销毁该对象,至少就您而言是这样,但它不要求立即销毁该对象:在第一次发布之后,Cocoa可以随意使用
s
以前使用的内存。它可能会将该内存提供给执行alloc
操作的下一个对象,在这种情况下,您以后尝试访问s
将导致剧烈的运行时崩溃……或者它可能不需要立即使用该内存,在这种情况下,您可以访问已发布的对象
经验法则不是“我释放了这个对象,这意味着它不再存在”,而是“我释放了这个对象,这意味着它不再保证存在。”Scott的答案是正确的,但在这种特殊情况下,原因是NSString文本(即@“)是唯一的编译时常量,在保留和释放时实际上根本不做任何事情。您将其分配给NSMutableString*实际上并没有使其成为NSMutableString,因此您编写的内容与
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];