2

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

}

任意のヘルプやガイダンスをいただければ幸いです。

4

1 に答える 1

6

を呼び出すCGImageCreateWithImageInRect()と、解放する必要のあるオブジェクトが返されます。(保持カウントは1です)

ARCは、CoreFoundationオブジェクトの保持/解放を処理しません。

コードは次のようになります。

{
    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 に答える