我在UIImageManipulation.m
中有以下方法:
+(UIImage *)scaleImage:(UIImage *)source toSize:(CGSize)size
{
UIImage *scaledImage = nil;
if (source != nil)
{
UIGraphicsBeginImageContext(size);
[source drawInRect:CGRectMake(0, 0, size.width, size.height)];
scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
return scaledImage;
}
我用不同的视图调用它:
imageFromFile = [UIImageManipulator scaleImage:imageFromFile toSize:imageView.frame.size];
(imageView是之前分配的UIImageView)
这在我的代码中运行良好。我完美地调整了图像的大小,并抛出零错误。我也没有在构建下弹出任何东西 - >分析。但是第二次我打开NSZombieEnabled
来调试另一个EXC_BAD_ACCESS
问题,代码中断了。每一次。我可以关闭NSZombieEnabled
,代码运行得很好。我打开它,然后热潮。破碎。我评论了这个电话,它再次起作用。每次都会在控制台中出现错误:-[UIImage release]: message sent to deallocated instance 0x3b1d600
。如果关闭`NSZombieEnabled,则不会出现此错误。
有什么想法吗?
好的,这让我很伤心。我到处都遇到断点,我仍然无法抓住这个东西。当我调用scaleImage
方法时,这是完整的代码:
-(void)setupImageButton
{
UIImage *imageFromFile;
if (object.imageAttribute == nil) {
imageFromFile = [UIImage imageNamed:@"no-image.png"];
} else {
imageFromFile = object.imageAttribute;
}
UIImage *scaledImage = [UIImageManipulator scaleImage:imageFromFile toSize:imageButton.frame.size];
UIImage *roundedImage = [UIImageManipulator makeRoundCornerImage:scaledImage :10 :10 withBorder:YES];
[imageButton setBackgroundImage:roundedImage forState:UIControlStateNormal];
}
另一个UIImageManipulator
方法(makeRoundCornerImage
)不应该导致错误,但为了防止我忽视某些内容,我将整个文件放在github here上。
虽然这是关于这种方法的。必须。如果我发表评论,那就很有效。如果我留下它,错误。但它不会因NSZombieEnabled
关闭而导致错误。
答案 0 :(得分:3)
NSZombieEnabled的目的是检测在解除分配后发送给对象的消息。您看到的控制台错误是NSZombieEnabled,它告诉您正在向release
的已解除分配的实例发送UIImage
消息。通常这样的错误是由于对release
的调用过多,或者调用retain
的调用不足。
在这种情况下,您的scaleImage:toSize:
方法会返回自动释放的UIImage
。您从NSZombieEnabled获取的错误消息表明您可能在返回后释放此对象。这可以解释你的错误。当您的自动释放池耗尽时,它会尝试释放已经解除分配的对象。
您将imageFromFile
传递给scaleImage:toSize:
,然后将该相同变量重新分配给返回值。这个成语本身并没有什么问题,但是需要一些额外的注意来避免像这样的内存错误。您正在覆盖对原始对象的引用,因此您必须确保在分配之前自动释放它,或者保存可在分配后手动释放的单独引用。否则你的原始物体会泄漏。
答案 1 :(得分:0)
该错误是由于makeRoundedCornerImage
UIImageManipulator
方法中发布的版本所致。仍然不确定为什么没有NSZombieEnabled
打开就没有被拿起,但那就是它。
您可以在我在原始问题中发布的Gist中找到违规行:第74行。