我有一种方法可以使用石英将屏幕外的对象绘制到文件中。这个方法的最后几行是:
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
所以,显然在方法内部分配的内存仍然是分配但没有泄漏?怎么会这样?
如何摆脱释放内存的内存分配?
提前感谢!
答案 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修复此问题。