Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我的对象在无数次发布后仍然有效?_Objective C_Cocoa_Memory Management - Fatal编程技术网

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];