我在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 )
这在我的代码中运行得很好。我完美地调整了图像的大小,并抛出了零错误。我也没有在build -> analyze下面弹出任何东西。但是,当我打开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的情况下抛出错误。
发布于 2010-06-08 05:06:22
NSZombieEnabled的目的是检测在被释放后发送给对象的消息。您看到的控制台错误是NSZombieEnabled,它告诉您一条release消息正被发送到一个已释放的UIImage实例。通常,像这样的错误是由于对release的调用过多,或者对retain的调用不足造成的。
在这种情况下,您的scaleImage:toSize:方法返回一个自动释放的UIImage。从NSZombieEnabled得到的错误消息表明,您可能会在此对象返回后释放它。这可以解释你的bug。当你的自动释放池耗尽时,它会尝试释放一个已经被释放的对象。
将imageFromFile传递给scaleImage:toSize:,然后将相同的变量重新赋值给返回值。这个习惯用法本身并没有错,但确实需要一些额外的注意,以避免像这样的内存错误。您正在覆盖对原始对象的引用,因此您必须确保在赋值之前自动释放它,或者保存一个单独的引用,以便在赋值之后手动释放。否则你的原始对象将会泄漏。
发布于 2010-06-11 06:22:07
该错误是由于UIImageManipulator的makeRoundedCornerImage方法中正在进行的发布造成的。仍然不确定为什么在没有打开NSZombieEnabled的情况下它没有被接受,但这就是它的原因。
您可以在我在原始问题中发布的要点中找到令人不快的行:第74行。
https://stackoverflow.com/questions/2991995
复制相似问题