【问题标题】:Releasing UIImage's Crashes the App释放 UIImage 会导致 App 崩溃
【发布时间】:2013-01-17 22:03:41
【问题描述】:

我的应用循环遍历图像路径数组并将所有这些图像合并为一个。代码如下。但是,当我在控制台中打印出带有 (gdb) 的图像时,应用程序会崩溃。如果我删除图像释放线,那么它可以正常工作,但这可能会导致内存泄漏。请查看此代码并解释为什么会发生这种情况以及可以改进的地方。谢谢你。

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width*len+padding*len+padding,
                                                  height+padding*2), 
                                       YES, 0.0);
do{

        //draw image
        path = (NSString*)[_imageData objectAtIndex:i];
        UIImage * img = [[[UIImage alloc] initWithContentsOfFile:path]
                           cropCenterAndScaleImageToSize:CGSizeMake(width, height)];
        [img drawAtPoint: CGPointMake(width*i+padding*i+padding,padding) blendMode:kCGBlendModeNormal alpha:1];
        [img release]; //APP CRASHES HERE BUT WORKS IF THIS LINE REMOVED
        i++;
    }while (i<len);
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(result, self,
                                   @selector(image:didFinishSavingWithError:contextInfo:),
                                   nil);

【问题讨论】:

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


    【解决方案1】:

    问题是您没有释放分配的图像。您正在释放自动释放的裁剪图像并泄漏分配的图像。

    改变这个:

    UIImage * img = [[[UIImage alloc] initWithContentsOfFile:path]
                       cropCenterAndScaleImageToSize:CGSizeMake(width, height)];
    [img drawAtPoint: CGPointMake(width*i+padding*i+padding,padding) blendMode:kCGBlendModeNormal alpha:1];
    [img release];
    

    到:

    UIImage *original = [[UIImage alloc] initWithContentsOfFile:path];
    UIImage *cropped = [original cropCenterAndScaleImageToSize:CGSizeMake(width, height)];
    [cropped drawAtPoint:CGPointMake(width * i + padding * i + padding, padding) blendMode:kCGBlendModeNormal alpha:1];
    [original release];
    

    我假设 cropCenterAndScaleImageToSize: 是某种类别方法,它返回自动释放的 UIImage 引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 2012-09-20
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      相关资源
      最近更新 更多