为什么这个泄漏记忆? UIImage`cellForRowAtIndexPath:`

时间:2010-06-02 20:21:57

标签: iphone objective-c memory-management memory-leaks uiimage

仪器泄漏告诉我这个UIImage正在泄漏:

UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png", [postsArrayID objectAtIndex:indexPath.row]]]];

// If image contains anything, set cellImage to image. If image is empty, try one more time or use noImage.png, set in IB
if (image != nil){
    // If image != nil, set cellImage to that image
    cell.cellImage.image = image;
}
image = nil;
[image release];

(类单元格(自定义表格视图单元格)也在dealloc方法中释放cellImage。)

我还没有弄清楚为什么会泄漏,但肯定是这样。 图像在cellForRowAtIndexPath: - 方法中多次加载。前三个单元的图像不会泄漏(130px高,所有空间都可用)。

泄漏给了我一个除UIImage allocated here in the code leaks之外的其他信息。

你可以帮我解决一下吗?谢谢:))

3 个答案:

答案 0 :(得分:5)

如果图片是@property,那么您的代码就是正确的。您可以通过执行self.property = nil来释放@property,因为setter的工作方式。 setter释放旧对象并将ivar设置为值。为了解决这个问题,您需要先放置[image release]。这里发生的是你将image设置为nil,然后你基本上在做[nil release]。旧图像只是漂浮在某处。所以要解决这个问题,请执行以下操作:

[image release];
image = nil;

答案 1 :(得分:3)

您在调用nil之前将其设置为release。因此,您要发布nil而不是image

更改自:

image = nil;
[image release];

为:

[image release];
image = nil;

答案 2 :(得分:0)

稍微修改代码

UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath 
        stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png",
        [postsArrayID objectAtIndex:indexPath.row]]]];

 if (image){
    cell.cellImage.image = image;
    [image release];