【问题标题】:removeObjectForKey: doesn't call deallocremoveObjectForKey:不调用 dealloc
【发布时间】:2011-04-13 11:39:31
【问题描述】:

我的印象是使用 removeObjectForKey:@"someKey" 从 NSMutableDictionary 中删除对象会释放被删除的对象。但是,当我这样做时,不会调用我的对象的 dealloc 方法。我必须明确释放它们吗?感谢您的帮助。

【问题讨论】:

  • 您确定其他东西没有像字典一样保留您的对象吗?
  • 确保没有其他东西保留有问题的对象。以防在将对象添加到字典时发送autorelease 消息。
  • 添加到字典中的对象如何分配?
  • 不要按照@Elmantas 的建议去做。永远不要发送额外的 releaseautorelease 消息“以防万一”。

标签: objective-c object release nsmutabledictionary


【解决方案1】:

removeObjectForKey 调用release——当然,假设你的@"someKey"确实匹配字典中的一个对象。但是,调用release 并不能保证该对象将获得dealloc-ed。这取决于它上面有什么其他所有权要求。

由于在这种情况下dealloc 消息没有被发送,我们可以得出结论,其他东西具有持续声明。这可能是也可能不是错误的结果——例如,如果您还将对象传递给某个系统组件,那么它可能非常合理地希望将您的对象保留得比您更长。

如果不是这样,最可能的原因是做了以下这些事情:

[dictionary setObject:[[SomeClass alloc] init] forKey:@"someKey"];

也就是说,永远不要放弃alloc 授予的初始所有权。相反,应该这样做:

[dictionary setObject:[[[SomeClass alloc] init] autorelease] forKey:@"someKey];

【讨论】:

  • 我想你能读懂我的心思!这正是我所做的(你的修复工作) - 我认为没有必要发布我将要使用和稍后发布的东西,所以我认为我不太明白。当我检查我的对象何时被初始化时,它只发生一次,那么为什么我需要释放它两次呢?就在我以为我掌握了内存管理的窍门时......
  • @Franklyn 初始化只发生一次,但可以质押多个所有权声明——第一个由alloc 提出,随后由retain 提出——这可能是其他事情的副产品,就像添加到字典一样。只有通过匹配对release 的调用放弃了所有所有权声明时,一个对象才为dealloc-ed,这可能再次作为其他事情的副产品发生,特别是autorelease,这基本上意味着“调用release一会儿”。由于您调用了alloc,因此您需要与releaseautorelease 平衡。
  • 谢谢 - 我想我现在明白了,毫无疑问,再花几百个小时制作这些东西就会成功...... :)
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多