【问题标题】:How Do I Manage Memory of A Decoded Object Returned From NSCoder?如何管理从 NSCoder 返回的解码对象的内存?
【发布时间】:2013-01-15 00:56:13
【问题描述】:

我已经从使用 NSCoder 编码中恢复了一个根对象,但不知道如何内存管理这个返回的对象。我用一个自动释放池包围了它,但是这个对象并没有随池一起出去。 Code Here, See line 289 行和代码可能会随着 Git Hub 提交而改变,但最终你会在工作代码中看到答案,祈祷。

自:

什么是保证完全释放我的解码对象的方法?

【问题讨论】:

  • 什么对象的停留时间比您预期的要长?只要您遵循通常的内存管理规则,您就不必担心“导致释放”。
  • 此对象可能包含大量数据,我坚持我必须确定至少即将删除。

标签: objective-c memory-management nscoder


【解决方案1】:

您正在管理从NSKeyedArchiver. 返回的内存

您要么需要显式保留它,并在完成后调用 release,要么立即使用它——例如写入文件。

我建议重新熟悉Memory Management Rules for Objective-C

手动内存管理一开始有点棘手,但是一旦你掌握了规则,它就会让这种情况很容易解决。

现在,如果您需要确保立即删除内存,则需要编写自己的二进制序列化程序,该序列化程序将遵循 alloc:init 模式,以便调用者明确拥有内存。这样当你在对象上调用 release 时,它​​就会被释放。

【讨论】:

  • 它在没有保留的情况下持续通过我的测试功能。当我无法控制至少启动 dealloc 过程时,这不被认为是泄漏吗?第 275 行:github.com/cxx6xxc/Node/blob/master/nodeInterface.m
  • 没有。这不是泄漏。在内部分配内存时,它会被添加到 AutoRelease 池中,当池耗尽时,它将被释放。 IIRC 您无法控制 AutoRelease 池何时耗尽,因为它由操作系统管理。如果你想验证,你可以手动调用对象的释放,这将减少引用计数,并且应该释放内存(但是当 AutoRelease 池清空时会引入一个非常糟糕的错误——所以不要把它留在里面! !)。
  • 它的行为似乎与其他基础自动关联实例不同。例如,如果立即自动释放,则必须保留 NSString。而不保留 NSCoder 对象似乎无关紧要,因为它们仍然通过应用程序事件循环多次驻留在内存中。为了测试,我发送了 4 条发布消息,这意味着它的保留计数为 4。稍后,我不会在应用程序关闭时获得典型的过度发布分段,而如果我发布自动释放 NSString 我会。所以,我很困惑为什么 NSCoder 会这样做。它似乎并不一致。
【解决方案2】:

NSCoder 不属于那个发布池。

【讨论】:

  • 我把游泳池拿出来了。那么它现在是全球性的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多