【问题标题】:UIImage imageWithData memory leakUIImage imageWithData 内存泄漏
【发布时间】:2011-06-21 09:52:46
【问题描述】:

使用 ASIHTTP,下面的代码在 ImageDownloader 类中。我得到一个内存泄漏,它被添加到底部,但我不知道为什么。我以为 tempImage 会在我不做任何事情的情况下自动释放?

- (void)requestFinished:(ASIHTTPRequest *)request
{
    UIImage *tempImage = [UIImage imageWithData:[request responseData]];

    if (tempImage.size.width > 250.0f && tempImage.size.height > 180.0f)
    {
        self.image = tempImage;
        self.circleImage = [UIImage imageNamed:@"hover.png"];

        if ([self.delegate respondsToSelector:@selector(addImageToModel:)])
            [self.delegate addImageToModel:self];
    }
    else 
    {
         if ([self.delegate respondsToSelector:@selector(badImage)])
            [self.delegate badImage];
    }

    tempImage = nil;
}

【问题讨论】:

  • 尝试写[tempImage release];之后 tempImage = nil;
  • @Marvin tempImage 已经自动发布,因此不需要发布。事实上,如果你释放它就会崩溃。
  • Ta,但遗憾的是没有阻止泄漏

标签: iphone memory-leaks uiimage


【解决方案1】:

self.image 被设置为 tempImage,因此它可能会保留图像。它在任何地方发布吗?

【讨论】:

  • 检查这两个属性 self.image, self.circleImage.
  • @daidai self 是什么对象?是否在其 dealloc 方法中自我释放图像?是否调用了dealloc方法?
  • 另外,addImageToModel: 方法有什么作用?
  • addImageToModel 将 ImageDownloader 对象/类发送到模型
  • 请注意,泄漏工具仅告诉您何时分配了泄漏的对象。它不会告诉您泄漏发生的位置。泄漏是由于任何导致对象保留的原因。另外,工具是否表明泄露的对象是 UIImage?
【解决方案2】:

你不应该写这行:

tempImage = nil;

由于 tempImage 是一个函数作用域变量,它会自行处理。 此外,如果 self.image 是(非原子的,分配的),这可能是您泄漏的根源。

关于堆栈跟踪图像,这是来自泄漏工具还是内存工具?

很遗憾,在您提供更多代码之前,我们无法为您提供进一步的帮助。

【讨论】:

  • 我想这就是我感到困惑的地方:“它会自己处理。” - 那为什么会有泄漏?
  • 不确定它来自那个...你能发布更多关于 self.image 的信息吗?
【解决方案3】:

正如 Thomas 所说,可能是 self.image 保留了图像?

你有没有考虑唤醒僵尸? ;)

http://www.mikeash.com/pyblog/friday-qa-2011-05-20-the-inner-life-of-zombies.html

http://www.cocoadev.com/index.pl?NSZombieEnabled

【讨论】:

  • 它实际上并没有导致崩溃,这是在 Instruments 中被拾取的,所以僵尸什么也没说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多