【发布时间】: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