0

スクリーンショットに示すように、ここでアプリがクラッシュします

私はバックグラウンドスレッドでメソッドを呼び出しています..以下に書かれています

   imageRef = assetLbraryImp.defaultRepresentation.fullResolutionImage;
   [self saveBigImageFull:imageRef withName:mediafileName addToAlbum:isFromCamera];

   -(void)saveBigImageFull:(CGImageRef)bigImage withName:(NSString*)imageName addToAlbum:   (BOOL)addToAlbum{
         bigImageFulldata = [NSArray arrayWithObjects: imageName, [NSNumber  numberWithBool:addToAlbum], nil];
[self saveBigImage:bigImageFulldata :bigImage];
 }
 -(void)saveBigImage:(id)data:(CGImageRef)imageRefere{
     _iName = (NSString *)[data objectAtIndex:0] ;
     bigImagefileName = [[NSString alloc]initWithFormat:@"%@.jpg", _iName] ;
    bigImageFilepath = [photoPath stringByAppendingPathComponent:bigImagefileName] ;
   [self savePhotoBig:imageRefere toPath:bigImageFilepath];
 }

   -(void)savePhoto:(CGImageRef)photo toPath:(NSString *)path{
       image = [UIImage imageWithCGImage:photo];
       imageData = UIImagePNGRepresentation(image);
       [imageData writeToFile:path atomically:NO];
       if(photo)
            CFRelease(photo);
   }

しかし、CFRelease が原因でアプリがクラッシュします。CFReleaseを削除すると、コードは正常に機能します.100枚の画像を保存している場合、100枚の画像が保存されます。エンドアプリのクラッシュで保存した後でも。途中ではなく、プロセスの最後にアプリがクラッシュします。

何か案が?

4

1 に答える 1

0

CFRelease が原因でアプリがクラッシュします。CFRelease を削除すると、コードは正常に動作します。

photoを呼び出すメソッドで何をしているのかを確認することをお勧めしますsavePhoto:photo電話してからアクセスしていますsavePhoto:か?

100 枚の画像を保存している場合、100 枚の画像が保存されます。エンドアプリのクラッシュで保存した後でも。

これは、メモリがいっぱいになる問題だと思います。Instruments のメモリ割り当てツールを使用してアプリをチェックし、メモリがいっぱいになったために強制終了されていることを確認します。

編集:

上記のコードを読むと、次の画像を保存しているようです。

imageRef = assetLbraryImp.defaultRepresentation.fullResolutionImage;

これは、後で を通じてリリースするイメージと同じですCFRelease。ここに2つのこと:

  1. おそらくassetLibraryImpが画像の実際の所有者であるため、リリースを任せたほうがよいでしょう(ただし、コードからこれを判断することはできないので、わかるでしょう);

  2. でリリースしたい場合は、の代わりにsavePhoto使用する必要があると思います。CGImageReleaseCFRelease

      if(photo)
           CGImageRelease(photo);
    

さらに、あなたはそのメソッドをバックグラウンド スレッドで実行していると言っています。UIKit はスレッド セーフではないことに注意してください。これがクラッシュの原因である可能性が高いです。そのメソッドをメイン スレッドで実行してみて (ただし、テストのためだけに UI をブロックします)、何が起こるかを確認してください。

于 2013-02-17T13:13:02.810 に答える