首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSZombieEnabled破坏了工作代码?

NSZombieEnabled破坏了工作代码?
EN

Stack Overflow用户
提问于 2010-06-08 02:13:15
回答 2查看 893关注 0票数 0

我在UIImageManipulation.m中有以下方法

代码语言:javascript
复制
+(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;
}

我在不同的视图中调用它:

代码语言:javascript
复制
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方法时的完整代码:

代码语言:javascript
复制
-(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的情况下抛出错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-08 05:06:22

NSZombieEnabled的目的是检测在被释放后发送给对象的消息。您看到的控制台错误是NSZombieEnabled,它告诉您一条release消息正被发送到一个已释放的UIImage实例。通常,像这样的错误是由于对release的调用过多,或者对retain的调用不足造成的。

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

imageFromFile传递给scaleImage:toSize:,然后将相同的变量重新赋值给返回值。这个习惯用法本身并没有错,但确实需要一些额外的注意,以避免像这样的内存错误。您正在覆盖对原始对象的引用,因此您必须确保在赋值之前自动释放它,或者保存一个单独的引用,以便在赋值之后手动释放。否则你的原始对象将会泄漏。

票数 3
EN

Stack Overflow用户

发布于 2010-06-11 06:22:07

该错误是由于UIImageManipulatormakeRoundedCornerImage方法中正在进行的发布造成的。仍然不确定为什么在没有打开NSZombieEnabled的情况下它没有被接受,但这就是它的原因。

您可以在我在原始问题中发布的要点中找到令人不快的行:第74行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2991995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档