Iphone 通过NSO操作在屏幕外位图上下文上创建UIImage时内存不足

Iphone 通过NSO操作在屏幕外位图上下文上创建UIImage时内存不足,iphone,memory-management,uiimage,nsoperation,Iphone,Memory Management,Uiimage,Nsoperation,我有一个带有多个UIView子类的应用程序,充当UIScrollView的页面。UIView来回移动,为用户提供无缝体验。由于视图的内容绘制速度相当慢,因此它在单个共享CGBitmapContext上呈现,由NSOperation子类(在NSOperationQueue中一次执行一个)的锁保护,并封装在UIImage中,然后由主线程用于更新视图的内容 -(void)main { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init]

我有一个带有多个UIView子类的应用程序,充当UIScrollView的页面。UIView来回移动,为用户提供无缝体验。由于视图的内容绘制速度相当慢,因此它在单个共享CGBitmapContext上呈现,由NSOperation子类(在NSOperationQueue中一次执行一个)的锁保护,并封装在UIImage中,然后由主线程用于更新视图的内容

-(void)main {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];

if([self isCancelled]) {
    return;
}
if(nil == data) {
    return; 
}

// Buffer is the shared instance of a CG Bitmap Context wrapper class
// data is a dictionary
CGImageRef img = [buffer imageCreateWithData:data];
UIImage * image = [[UIImage alloc]initWithCGImage:img];
CGImageRelease(img);

if([self isCancelled]) {
    [image release];
    return;
}

NSDictionary * result = [[NSDictionary alloc]initWithObjectsAndKeys:image,@"image",id,@"id",nil];

// target is the instance of the UIView subclass that will use
// the image
[target performSelectorOnMainThread:@selector(updateContentWithData:) withObject:result waitUntilDone:NO];

[result release];
[image release];

[pool release];
}
在主线程上执行的UIView子类的updateContentWithData:也同样简单

-(void)updateContentWithData:(NSDictionary *)someData {

NSDictionary * data = [someData retain];

if([[data valueForKey:@"id"]isEqualToString:[self pendingRequestId]]) {

    UIImage * image = [data valueForKey:@"image"];
    [self setCurrentImage:image];
    [self setNeedsDisplay];

}

// If the image has not been retained, it should be released together
// with the dictionary retaining it
[data release];
}
子类的drawLayer:inContext:方法将只从UIImage获取CGImage,并使用它来更新背景层或其一部分。过程中不涉及保留或释放

问题是过了一段时间我的内存就用完了。UIView的数量是静态的。CGImageRef和UIImage的创建、保留和发布都是正确的,在我看来也是如此。仪器没有显示任何泄漏,只是可用的可用内存不断下降,上升几次,然后下降甚至更低,直到应用程序终止。在此之前,该应用程序会循环浏览上述页面中的大约2-300页,但我希望在快速浏览大量页面后,或者由于图像大小高达3MB,内存使用会达到或多或少的稳定水平


任何建议都将不胜感激。

我意识到这是一个老帖子,但万一对其他人有帮助。。。。这看起来像是内存碎片的情况。我们有一个应用程序的行为方式相同。应用程序实际分配的内存量永远不会达到危险的水平,但如果您使用分配工具或活动监视器工具中的VM Tracker快照查看应用程序的驻留内存量,它会随着时间的推移不断攀升,直到一个不太大的瞬时峰值杀死应用程序

这个有争议的应用程序是一个多线程的应用程序,它可以在大范围内进行大量的临时分配,而这些分配的时间是无法预测或控制的。这样的应用程序必须对释放不必要的内存分配心存疑虑,这不是因为它们本身占用了太多内存,而是因为它们可能会产生孔洞,阻止较大的图像装入分配的块中。即使是容易被忽略的较小的分配在碎片化中也很重要,因为低级别的分配器按大小分组分配,这在一定程度上是有帮助的。内存区域在理论上有助于解决碎片问题,但很难使其有效,至少在我的经验中是这样。另外,尽可能多地使用自定义的自动发布池,或者更好地使用alloc/init,并尽早发布。底层框架总是为缓存目的进行自己的分配,这一事实可能没有帮助