IPHONE:释放对象后仍然分配内存?

时间:2009-11-22 17:47:29

标签: iphone iphone-sdk-3.0 quartz-graphics

我有一种方法可以使用石英将屏幕外的对象绘制到文件中。这个方法的最后几行是:

CGRect LayerRect = CGRectMake(mX,mY, wLayer, hLayer);
CGContextDrawImage(objectContext, LayerRect, objectProxy.image.CGImage); // 1

CGRect superRect = CGRectMake(vX, vY, w,h);
CGContextDrawLayerInRect(context, superRect, objectLayer);

CGLayerRelease(objectLayer); // 2
UIImage * myImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext(); //3
return myImage;

如您所见// 1上绘制的图层在// 2上发布,上下文在// 3上发布。

那么,没有泄漏吗?

实际上,乐器会将此报告为没有泄漏,但在运行此方法并返回主循环后,我的应用程序比以前使用了1.38 MB的内存。

调查intruments,在内存分配选项卡上,我看到一个条目

Malloc 1.38 MB
overall bytes = 1.38 MB
#Overall = 1
#alloc = 
Live Bytes = 1.38 MB
#Living = 1
#Transitory = 0

此条目指向此

CGContextDrawImage(objectContext, LayerRect, objectProxy.image.CGImage); // 1

所以,显然在方法内部分配的内存仍然是分配但没有泄漏?怎么会这样?

如何摆脱释放内存的内存分配?

提前感谢!

2 个答案:

答案 0 :(得分:1)

图像肯定会使用一些内存。我并不完全熟悉iPhone编程,但OS X下的图像始终是您制作图像的副本。文档说,图像存在于自动释放池中,因此根据您管理池的方式,它可以在那里存在很长一段时间。您可以尝试在调用函数中围绕调用放置一个autoreleasepool(将它放入上面引用的te函数会返回一个无效对象)。

通常我可以说,一旦自动释放池开始发挥作用,尝试跟踪对象的释放将变得非常麻烦(有时候也不可能......自动释放对象背后的想法是系统知道何时释放它们(这可以驱使像我这样的C ++程序员疯狂......当然,Objective C和Cocoa并不能让我开心: - )))

但是,假设您的上述函数称为drawOffline,您应该能够通过

删除图像中的内存
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *ret= [self drawOffline];
// do some work using ret (possibly copying it)
[pool release];
// memory should be released and the ret ptr is invalid from this point on.

更进一步,如果你打算稍微使用ret ptr,你应该保留它,告诉系统即使自动释放池释放它也不应该删除它。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *ret= [self drawOffline];
[ret retain]; // prevent ret from being deleted when the pool releases it
// do some work using ret (possibly copying it)
[pool release];
// ret ptr will continue to live until you release it.

// more stuff

[ret release]; // image behind ret being freed 

如上所述,通常使用自动释放对象,您不必担心它们的生命周期,但如果您打算将它们保留更长时间(特别是将其存放在对象成员中供以后使用),您需要自己保留/释放它,否则系统可以将它拉到你的脚下。

这[link] [1]描述了OS X下的内存管理,但也适用于iphone。

[1]:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html链接

答案 1 :(得分:-1)

显然没有解决方案,直到Apple修复此问题。