UIImageView setImage泄漏?

时间:2011-05-04 04:48:12

标签: iphone objective-c ios4 ipad

现在一直在寻找解决这个问题的方法。问题很简单。笔尖中有一个UIImageView,我正在从互联网上加载图像并将UIIImageView设置为图像。我正在发布viewController。 Dealloc实际上被调用(!)并再次加载viewController和图像。这可以通过非常简单地进入后台模式来完成。仪器泄漏不报告任何泄漏,但它在分配中显示它将图像保留在内存中并且它不断增长。

基本示例:

-(id)init {
    if((self = [super init])) {
        id path = [NSString stringWithFormat:@"http://www.aSite.com/largeImage.jpg"];
        NSData* urlData = [[NSData alloc] initWithContentsOfURL:url];
        UIImage* img = [[UIImage alloc] initWithData:urlData];
        [background setImage:img];
        [urlData release];
        [img release];
    }
    return self;
}

-(void)dealloc {
    [background release];
    [super dealloc];
}

有人说UIImageView实际上是泄密,实际上是CGImage。有人说仪器没有正确显示。在使用2.5mb大图像进行10-15次后,我得到了内存警告。结果来自真实设备和最新iOS(或至少4-5周前)。由于UIImageView被很多人使用,我认为很容易找到问题或者从苹果那里得到修复?

CGImage泄漏的来源: (iphone) UIImageView setImage: leaks?

编辑:我写这个例子的时候我是abit tierd。示例现在是正确的。我也试过自动释放的对象,同样“泄漏”仍然存在。如果你要写一个答案,请回答问题

4 个答案:

答案 0 :(得分:2)

release设置图片后的网址

[background setImage:[UIImage imageWithData:urlData]];
[urlData release];
[img release];

答案 1 :(得分:1)

在以下代码中,您犯了一些错误。

  [urlData release];
  [background setImage:[UIImage imageWithData:urlData]];

你应该使用

if((self = [super init])) {
        id path = [NSString stringWithFormat:@"http://www.aSite.com/largeImage.jpg"];
        NSData* urlData = [[NSData alloc] initWithContentsOfURL:url];
        UIImage* img = [[UIImage alloc] initWithData:urlData];
        [background setImage:img];
        [urlData release];
        [img release];
    }

答案 2 :(得分:0)

你不能替换

[background setImage:[UIImage imageWithData:urlData]];

[background setImage:img];

<强>更新

我认为这也应该有所帮助

if((self = [super init])) {
        id path = [NSString stringWithFormat:@"http://www.aSite.com/largeImage.jpg"];
        NSData* urlData = [[NSData alloc] initWithContentsOfURL:url];
        [background setImage:[UIImage imageWithData:urlData]];
        [urlData release];

    }

答案 3 :(得分:0)

你试过了吗?

-(id)init {
    if((self = [super init])) 
    {

        [background setImage:
             [UIImage imageWithData:
                 [NSData dataWithUrl:
                    [NSUrl urlWithString:
                       @"http://www.aSite.com/largeImage.jpg" ]]]
        ];

    }
    return self;
}

-(void)dealloc {
    [super dealloc];
}

干净且没有内存泄漏!