【问题标题】:Memory leak from UIImage in iOSiOS中UIImage的内存泄漏
【发布时间】:2011-08-31 20:07:11
【问题描述】:

我有来自 UIImage 对象的潜在内存泄漏问题。代码如下。请帮忙。

UIImage *image = nil; 如果(x == 0){ 图像 = [UIImage imageWithCGImage:cg1]; } 别的 { 图像 = [UIImage imageWithCGImage:cg2]; } UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [图片发布];

我试图在 if-else 块之后释放 UIImage 对象,但 Xcode 警告“调用者此时不拥有的对象的引用计数不正确递减”,

如果我删除 [image release],它会显示“在线分配的对象的潜在泄漏......”。

如何解决问题?

谢谢。

【问题讨论】:

    标签: iphone ipad


    【解决方案1】:

    问题是[UIImage new][[UIImage alloc] init] 一样,所以你已经有了一个保留实例。然后通过调用[UIImage imageWithCGImage:] 将指向该实例的指针扔掉,这将返回一个您不需要保留的自动释放实例!

    解决方案是把[UIImage new][image release] 一起扔出你的代码。

    【讨论】:

    • 是的,你也需要扔掉[image release],因为图像已经自动释放了。
    • 谢谢,但在我删除 [image release] 后,它显示“在线分配的对象的潜在泄漏......”。请帮忙。
    【解决方案2】:
    UIImage *image = nil;
    
    if (x == 0) {
        image = [UIImage imageWithCGImage:cg1];
    } else {
        image = [UIImage imageWithCGImage:cg2];
    }
    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    // Some code
    [imageView release];
    

    您拥有对象 imageView 而不是 image 的所有权。所以你应该释放imageView 而不是image。看看Object ownership in Apple's Memory Management guide

    【讨论】:

    • 尝试了您的建议。警告仍然显示 - 在线分配的对象的潜在泄漏...
    • 如何调查?我尝试使用 Instruments,但我真的不知道用它来检查泄漏。
    • 当你使用 Build and Analyze 时,你会得到一个蓝色的图标来显示泄漏。单击它以显示泄漏
    【解决方案3】:

    您正在使用new 方法分配UIImage 对象的新实例并将其分配给image 变量。然后,您会立即通过使用imageWithCGImage: 方法为变量分配不同的实例来泄漏该实例。

    一开始你不需要UIImage *image = [UIImage new];。您可以简单地声明您的变量,而无需为其分配任何实例。好的做法是最初将nil 分配给它。

    执行此操作后,您以后不需要释放图像对象,因为imageWithCGImage 返回一个自动释放的对象。

    【讨论】:

    • 尝试了您的建议。警告仍然显示 - 在线分配的对象的潜在泄漏......有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多