NSZombieEnabled打破工作代码?

时间:2010-06-07 18:13:15

标签: iphone xcode exc-bad-access dealloc nszombie

我在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关闭而导致错误。

2 个答案:

答案 0 :(得分:3)

NSZombieEnabled的目的是检测在解除分配后发送给对象的消息。您看到的控制台错误是NSZombieEnabled,它告诉您正在向release的已解除分配的实例发送UIImage消息。通常这样的错误是由于对release的调用过多,或者调用retain的调用不足。

在这种情况下,您的scaleImage:toSize:方法会返回自动释放的UIImage。您从NSZombieEnabled获取的错误消息表明您可能在返回后释放此对象。这可以解释你的错误。当您的自动释放池耗尽时,它会尝试释放已经解除分配的对象。

您将imageFromFile传递给scaleImage:toSize:,然后将该相同变量重新分配给返回值。这个成语本身并没有什么问题,但是需要一些额外的注意来避免像这样的内存错误。您正在覆盖对原始对象的引用,因此您必须确保在分配之前自动释放它,或者保存可在分配后手动释放的单独引用。否则你的原始物体会泄漏。

答案 1 :(得分:0)

该错误是由于makeRoundedCornerImage UIImageManipulator方法中发布的版本所致。仍然不确定为什么没有NSZombieEnabled打开就没有被拿起,但那就是它。

您可以在我在原始问题中发布的Gist中找到违规行:第74行。