【问题标题】:Cocoa Memory Usage可可内存使用
【发布时间】:2011-02-01 21:32:12
【问题描述】:

我正在尝试在我的 Cocoa 桌面应用程序中追踪一些特殊的内存行为。我的应用程序使用 NSImage 进行了大量图像处理,并使用 NSURLConnection 通过 HTTP 将这些图像上传到网站。

上传数百张图片(有些非常大)后,当我运行 Instrument 时,我没有发现任何泄漏。我也运行过 MallocDebug 并且没有泄漏。当我使用 Instrument 深入研究对象分配时,我得到如下输出:

GeneralBlock-9437184, Net Bytes 9437184, # Net 1
GeneralBlock-192512, Net Bytes 2695168, # Net 14

等等,对于较小的尺寸。当我详细查看这些时,它们被标记为由“基金会”拥有并通过 NSConcreteMutableData initWithCapacity 创建。在 HTTP 上传期间,我正在使用 NSMutableData 创建一个帖子正文,所以我猜这些是 Cocoa 在我创建 NSMutableData 对象时为我缓存的缓冲区。

有没有办法强制 Cocoa 释放这些?我有 90% 的肯定我正在正确发布(并且 Instruments 和 MallocDebug 似乎证实了这一点),但我认为 Cocoa 出于性能原因保留这些,因为我分配了这么多 MSMutableData 缓冲区。

【问题讨论】:

  • “在 HTTP 上传期间,我正在使用 NSMutableData 创建一个帖子正文,所以我猜这些是 Cocoa 在我创建 NSMutableData 对象时为我缓存的缓冲区。”您可以使用 Instruments 自行测试。查看这些分配的堆栈跟踪——它们会告诉你什么叫做initWithCapacity:。您还可以查看 NSMutableData 对象的对象历史记录。
  • 我验证了它们是由于我的代码使用 initWithCapacity 创建 NSMutableData 而创建的。我还验证了我在每种情况下都在调用 release。 NSConcreteMutableData 对象仍然存在——我认为可可正在缓存这些分配并重用它们。希望我能找到一种方法来强制它清理它们。
  • 为什么?如果你没有分配它,你不负责释放它。如果您认为这里有错误,您可以随时在bugreport.apple.com 提交错误。您确定要释放 NSMutableData 对象吗?你能开发一个重现问题的示例应用程序吗?

标签: cocoa memory instruments memory-leaks


【解决方案1】:

如果您确定您正确地释放了您拥有的对象,那么您真的无能为力(或应该)做任何事情。正如 Instruments 所说,这些块归 Foundation 所有,因为 Foundation 对象 NSConcreteMutableData 创建了它们。这些可能是NSData 故意保留的某种缓存,但无法知道它们是什么。

如果您认为这是一个错误,您应该在http://bugreport.apple.com 报告它。内存所有权规则也适用于不能很好地管理内存的类。

另外,这可能是一个愚蠢的问题,但是您将哪个选项用于 Object Alloc 工具?所有已创建或已创建但仍然存在的对象?您可能正在查看不再重要的分配。

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2021-09-22
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多