【问题标题】:Autoreleasing twice an object自动释放对象两次
【发布时间】:2012-07-02 18:09:53
【问题描述】:
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);      

谁能帮我介绍一下这段代码。自动释放对象两次会发生什么。当我运行代码时,我没有得到任何僵尸。为什么会这样。

【问题讨论】:

    标签: iphone ipad autorelease nsautoreleasepool


    【解决方案1】:

    当自动释放池被销毁时,对象被释放两次,这可能是在运行循环迭代结束时。它不会崩溃的原因是,NSString 在某些情况下返回单例,例如您创建的空字符串或字符串文字(您应该 NOT 依赖它,这正是当前发生的情况!) ,这些对象不会被释放,这就是你不会得到僵尸的原因。

    【讨论】:

    • 如果不是字符串,而是另一个类怎么办?
    【解决方案2】:

    首先没有理由调用 autorelease 两次。

    一旦一个对象被标记为自动释放,再次调用它的自动释放将被忽略。https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

    但在您发布的示例中,您正在创建一个空字符串:

    NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
    

    然后你给它分配另一个字符串:

    str = @"hii";
    

    这意味着您分配的第一个字符串将被泄漏,您确实自动释放了它,因此它会在最后被清理。但是没有理由将字符串分配在第一个位置。

    你可以这样做:

    NSString *str =@"hii";
    NSLog(@"%@",str);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多