【问题标题】:NSMutableDictionary not calling 'release' upon removing objectNSMutableDictionary 在删除对象时不调用“释放”
【发布时间】:2014-03-14 15:15:21
【问题描述】:

据我了解,NSMutableDictionary 在释放自身时释放所有对象。我为此写了一个测试:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) 
{
    @autoreleasepool 
    {
        NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

        NSObject *object = [[NSObject alloc] init];
        [dictionary setObject:object forKey:@"key"];
        [dictionary release];

        NSLog(@"%@", object);
    }
}

但是,对象仍然存在,并且没有被释放:

2014-02-15 09:34:31.883 Untitled[15548:707] <NSObject: 0x7fa0b9c09c60>

为什么会这样?

【问题讨论】:

  • 尝试在最后一种情况下转储保留计数。
  • 你真正想做什么?

标签: objective-c oop nsmutabledictionary ownership


【解决方案1】:

您已对“object”进行了分配和初始化。这使得保留计数为 1。

当您将其添加到字典中时,保留计数为 2。

当您释放字典时,对象的保留计数减为 1。

这就是为什么您可以打印出它的“内容”,因为“object”的保留计数为 1,尚未真正释放。

【讨论】:

  • 在 NSLog 之前调用 [object release]; 并准备崩溃(因为对象现在已经消失了)。或者您可以在 NSLog 之后调用“release”,您不会崩溃。
  • @AaronBrager 对于显式 autoreleased 对象肯定是这种情况,但是当常规保留对象超出范围时,内存是否会神奇地释放?
  • @MichaelDautermann 不,您的评论是正确的(我删除了我的错误评论)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多