【问题标题】:Why does my object still work after countless releases?为什么我的对象在无数次发布后仍然有效?
【发布时间】:2011-10-02 13:57:18
【问题描述】:

我似乎永远无法释放我的NSMutableString,如下所示。最初的retain count应该是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 释放了一个已释放对象。

【问题讨论】:

    标签: objective-c cocoa memory-management


    【解决方案1】:

    Scott 的回答是正确的一般答案,但在这种特殊情况下,原因是 NSString 文字(即 @"")是唯一的编译时常量,并且在保留和释放时实际上根本不做任何事情。您将其分配给 NSMutableString* 实际上并没有使其成为 NSMutableString,因此您编写的内容等同于

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

    【讨论】:

      【解决方案2】:

      释放一个对象告诉运行时它可以销毁该对象,至少就您而言,但它并不要求该对象是立即销毁:在您的第一个[s release] 之后,Cocoa 可以随意使用s 以前使用的内存做任何事情。它可能会将内存分配给执行alloc 的下一个对象,在这种情况下,您以后尝试访问s 将导致运行时崩溃……或者它可能不需要立即使用该内存,在这种情况下,您可能避免访问已释放的对象。

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

      【讨论】:

        猜你喜欢
        • 2020-08-02
        • 1970-01-01
        • 2015-12-01
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 2020-09-09
        相关资源
        最近更新 更多