2

我在 Xcode 4.5.2 中有一个应用程序,我正在使用 ARC。我的应用程序一直在构建和运行,没有编译器警告或错误,但是,当应用程序进入后台然后返回前台时(特别是在中间经过很长一段时间后),应用程序崩溃。我对 iOS 还很陌生,我一直在无休止地尝试分析崩溃报告,并象征性地表示崩溃,但到目前为止,我一直未能成功收集到问题的任何线索。然而,突然当我重新打开我的项目时,一行代码(一直存在)现在显示蓝色编译器警告:Memory (Core Foundation/Objective C) Potential Leak of an Object。 我不明白为什么这段代码在使用 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];

}

任何帮助或指导表示赞赏。

4

1 回答 1

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))]]; 
于 2013-02-22T00:28:46.480 回答