2010-03-29 13 views
0

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

上传几百张图片(一些非常大)后,当我运行仪器时,我没有泄漏。我也跑过了MallocDebug并没有泄漏。当我使用仪器挖掘对象分配时,我得到如下输出:

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

等等,适用于较小的尺寸。当我详细查看这些内容时,它们被标记为由'Foundation'拥有,并通过NSConcreteMutableData initWithCapacity创建。在HTTP上传过程中,我使用NSMutableData创建了一个帖子主体,所以我猜这些是缓冲区。当我创建NSMutableData对象时,Cocoa为我缓存。

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

+0

“在HTTP上传过程中,我使用NSMutableData创建了一个帖子主体,所以我猜这些是缓冲区。当我创建NSMutableData对象时,Cocoa为我缓存。”您可以使用Instruments来为自己测试。看看这些分配的堆栈跟踪 - 它们会告诉你什么叫做'initWithCapacity:'。您还可以查看NSMutableData对象的对象历史记录。 – 2010-03-29 03:49:43

+0

我验证了它们是由于我的代码使用initWithCapacity创建NSMutableData而创建的。我也证实我在每个案例中都会发布释放。但NSConcreteMutableData对象仍然坚持 - 我认为可可正在缓存这些分配并重新使用它们。希望我能想出办法强制它清理它们。 – 2010-03-29 04:02:44

+1

为什么?如果你没有分配它,你不负责解除分配它。如果您认为这里存在缺陷,您可以随时在http://bugreport.apple.com上提交错误。你确定你正在发布NSMutableData对象吗?你能开发一个能重现问题的示例应用程序吗? – ericg 2010-03-29 12:50:23

回答

0

如果你确定你正在释放你拥有的对象,那么你确实没有办法(或者应该)做什么。正如乐器所说,这些区块是由基金会拥有的,因为基金会对象NSConcreteMutableData创建了它们。这可能是某种缓存NSData是故意保留的,但无法知道它们是什么。

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

此外,这可能是一个愚蠢的问题,但您使用的对象Alloc工具的选项?所有创建或创建的对象仍然存在?您可能正在考虑无关紧要的分配。