使用Xcode和ARC的对象潜在泄漏

时间:2013-02-22 00:23:24

标签: objective-c xcode memory-leaks crash-reports

我在Xcode 4.5.2中有一个应用程序,我正在使用ARC。我的应用程序一直在构建和运行,没有编译器警告或错误,但是,当应用程序进入后台然后返回到前台时(特别是在延长的时间段之后),应用程序崩溃。我对iOS很新,我一直在努力分析崩溃报告,并象征崩溃,但到目前为止,我还没有成功收集任何问题的线索。然而,当我重新打开我的项目时,一行代码(一直存在)现在显示蓝色编译器警告:内存(Core Foundation / Objective C)对象的潜在泄漏。 我不明白为什么这段代码在使用ARC的情况下产生这个警告,我也不明白为什么它会突然出现。我假设这可能与崩溃问题有关,但我不知道为什么我收到此错误因此我不知道如何解决它。

以下是问题所在的代码:

- (void) cropPhoto:(UIImage *)originalImage inImageView:(UIImageView *)imageView atXPoint:(int)x atYPoint:(int)y withWidthSize:(int)width withHeightSize:(int)height
{
  CGSize size = [originalImage size]; //gets size of Facebook photo

  [imageView setFrame:CGRectMake(0, 0, size.width, size.height)]; 

  [self.view addSubview:imageView]; //adds imageView to view

  CGRect rect = CGRectMake (size.width / 4, size.height / 4 ,
                          (size.width / 1), (size.height / 2));

  //THIS NEXT LINE GIVES THE COMPILER WARNING!!
  [imageView setImage:[UIImage    
        imageWithCGImage:CGImageCreateWithImageInRect([originalImage CGImage], rect)]]; 

  [imageView setFrame:CGRectMake(x, y, width, height)];
  [self.view addSubview:imageView];

}

感谢任何帮助或指导。

1 个答案:

答案 0 :(得分:6)

调用CGImageCreateWithImageInRect()会返回您必须释放的对象。 (保留计数为1)

ARC不会为您处理Core Foundation对象的保留/释放。

您的代码应如下所示:

{
    CGImageRef cgImage = CGImageCreateWithImageInRect([originalImage CGImage], rect)
    [ imageView setImage:[ UIImage imageWithCGImage:cgImage ] ] ;
    CGImageRelease( cgImage ) ;
}

编辑:

这是另一种选择:

[imageView setImage:[UIImage    
    imageWithCGImage:CFBridgingRelease( CGImageCreateWithImageInRect([originalImage CGImage], rect))]];