【问题标题】:UIImageView setImage Leaks?UIImageView setImage 泄漏?
【发布时间】:2011-05-04 04:48:12
【问题描述】:

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

基本示例:

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

编辑:当我写这个例子的时候,我有点过分了。现在的例子是正确的。我也尝试过使用自动释放的对象,并且仍然存在相同的“泄漏”。如果您要写答案,请回答问题

【问题讨论】:

    标签: iphone objective-c ios4 ipad


    【解决方案1】:

    release设置图片后的url

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

    【讨论】:

    • 与问题无关。此外 [[UIImage alloc] initWithData:urlData] 保留了 NSData,因此可以在 [background setImage:img]........ 之前释放
    【解决方案2】:

    在下面的代码中你犯了一些错误。

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

    【讨论】:

    • 与问题无关。此外 [[UIImage alloc] initWithData:urlData] 保留了 NSData,因此可以在 [background setImage:img]........ 之前释放
    【解决方案3】:

    你不能替换

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

    【讨论】:

    • 那只是你尝试第一个的选项。
    【解决方案4】:

    你试过了吗:

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

    干净且没有内存泄漏!

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多