[英]Objective C: EXC_BAD_ACCESS when generating a UIImage
我有一个基于一系列图层生成图像的视图。 我有用于背景,缩略图和最后用于覆盖的图像。 一起,它使一个内聚的显示。
似乎在做梦,除非不是。 似乎没有原因,在生成指定的8到20张图像之后,我在下面的指定行上得到了EXC_BAD_ACCESS。 我已经通过内存泄漏工具和分配工具运行了它,它没有耗尽大量内存,也没有泄漏。 我完全迷住了。
以下是相关代码:
- (UIImage *)addLayer:(UIImage *)layer toImage:(UIImage *)background atPoint:(CGPoint)point {
CGSize size = CGSizeMake(240, 240);
UIGraphicsBeginImageContext(size);
[background drawAtPoint:CGPointMake(0, 0)]; // <--- error here
[layer drawAtPoint:point];
UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result;
}
// Build the layered image -- thingPage onto thingBackground,
// then the screenshot on that, then the thingTop on top of it all.
// thingBackground, thingPage and thingTop are all preloaded UIImages.
-(UIImage *)getImageForThing:(Thing *)t {
[self loadImageCacheIfNecessary];
if (!t.screenshot) {
return [UIImage imageNamed:@"NoPreview.png"];
} else {
UIImage *screenshot = t.screenshot;
UIImage *currentImage = [self addLayer:thingPage toImage:thingBackground atPoint:CGPointMake(0, 0)];
currentImage = [self addLayer:screenshot toImage:currentImage atPoint:CGPointMake(39, 59)];
currentImage = [self addLayer:thingTop toImage:currentImage atPoint:CGPointMake(0, 1)];
return currentImage;
}
}
我找不到任何地方出了问题,为此,我已经把头发扯了几个小时。 这是系统中最后一个已知的错误,因此您可以想象我要修复它的热情! :-)
在此先感谢您的帮助。
对于我来说,我总是使用-(void)drawInRect:而不是-(void)drawAtPoint:
CGRect rtDraw;
rtDraw.origin = CGPointZero;
rtDraw.size = size;
[background drawInRect:rtDraw];
[layer drawInRect:rtDraw];
并且....具有UIGraphicsBeginImageContext(size)和UIGraphicsEndImageContext()的paint方法不是线程安全的。 这些功能将通过系统管理的栈结构推送或弹出上下文。
EXC_BAD_ACCESS
几乎总是归因于访问已释放的对象。 在您的代码中,这似乎是t.screenshot
。 检查Thing
的screenshot
属性返回的对象的创建(并保留是否为实例变量)。
事实证明,该错误不是在我发布的代码中,而是在我对thingBackground
, thingPage
和thingTop
图像进行缓存时。 我没有保留他们。 这是固定的缺少的代码:
-(void)loadImageCacheIfNecessary {
if (!folderBackground) {
thingBackground = [[UIImage imageNamed:@"ThingBack.png"] retain];
}
if (!folderPage) {
thingPage = [[UIImage imageNamed:@"ThingPage.png"] retain];
}
if (!folderTop) {
thingTop = [[UIImage imageNamed:@"ThingTop.png"] retain];
}
}
我承认我对Objective C中的全部保留/释放/自动释放内容仍然不满意。希望它很快就会消失。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.