2011-05-04 76 views
3

现在无休止的时间一直在寻找解决这个问题的方法。问题很简单。我在笔尖有一个UIImageView,我正在从网上加载一张图片,并将图片设置为UIIImageView。我释放viewController。 Dealloc实际上正在调用(!)并再次加载viewController和图像。这可以通过非常容易地进入背景模式来完成。仪器泄漏不报告任何泄漏,但它表明它在分配中保持图像在内存中并且保持增长。UIImageView setImage泄漏?

基本例如:

-(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?

编辑:我是升技tierd当我写的例子。示例现在正确。我也尝试过使用自动释放对象,同样的“泄漏”仍然存在。如果你要写答案,请回答问题

回答

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]; 
    } 
+0

与问题无关。另外[[UIImage alloc] initWithData:urlData]保留了NSData,因此在[backgroundsetImage:img]之前释放它是可以的...... – David 2011-05-04 05:31:41

0

不能更换

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

[background setImage:img]; 

UPDATE

我想,这也应该帮助

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]; 

    } 
+0

我尝试过使用自动释放对象的相同内存“leaks” – David 2011-05-04 05:14:15

+0

那是只是一个选项,你尝试了第一个。 – visakh7 2011-05-04 05:14:45

+0

是的,同样的问题。 – David 2011-05-04 05:19:11

2

release的URL设置图像后

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

与问题无关。另外[[UIImage alloc] initWithData:urlData]保留了NSData,因此在[background setImage:img]之前释放它是个好主意........ – David 2011-05-04 05:31:33

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]; 
} 

干净,没有内存泄漏!