2011-07-13 20 views
1

私はいくつかのサンプルコードを使用しています。私は基本的にAVCamRecorderを使ってスナップショットを作成するチュートリアルから得ました。画像を保存しません。ボタンをクリックするたびにライブカメラビューの下にちょっとした矩形で表示されます。イメージを更新するためにボタンをクリックするたびにメモリが割り当てられるように思われたので、if (image) {[image release]}を置き、残りのコードを続けてイメージをキャプチャしました。私がそこに遭遇した問題は、ボタンを十分速く繰り返しクリックすると、ついにEXC_BAD_ACCESSにぶつかりました。私はそれを私のビューに割り当てる直前にif (image)を挿入しようとしましたが、私はまだEXC_BAD_ACCESSを取得します。私は最後に​​を追加しようとしましたが、どちらも役に立たなかった。ボタンを数回クリックしてもEXC_BAD_ACCESSが表示されます。このビューを再利用する適切な方法はありますか?ありがとうUIImageを再利用する方法

if (image) { 
    [image release]; 
    exifAttachments = nil; 
} 
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:stillImageConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 
    exifAttachments = CMGetAttachment(imageDataSamplebuffer, kCGImagePropertyExifDictionary, NULL); 
    if (exifAttachments) { 
     // NSLog 
    } else { 
     // NSLog 
    } 
    NSData *imagedata = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
    image = [[UIImage alloc] initWithData:imageData]; 
    if (image) { 
     self.capturedPicView.image = image; 
    } 
}];` 
+0

それは.. – Filo

+0

ありがとう、ディパク。 – Filo

+0

私はEXC_BAD_ACCESSをself.capturedPicView.image = image – Filo

答えて

3

イメージ変数は__blockとして宣言されていますか?そうでない場合は、ブロック内で変更することができないため、あらゆる種類の奇妙なものが得られる可能性があります。

あなたはおそらく別のイメージ変数を必要としない - だけで実行します。

self.capturedPicView.image = [[[UIImage alloc] initWithData:imageData] autorelease]; 

あなたのブロックで。

P.S.そして、あなたのオリジナルのメモリリークが新しいイメージを解放しないためであったように見えます - あなたはUIImageの作成に自動解放を追加またはちょうど右(UIImageView.imageはとにかくそれを保持)割り当てた後、それを解放することができた:フォーマットしようとして

image = [[UIImage alloc] initWithData:imageData]; 
if (image) { 
    self.capturedPicView.image = image; 
    [image release]; 
} 
+0

私はnull imageDataSampleBufferを取得することがありましたので、イメージを割り当てる前に 'if(imageDataSampleBuffer)'を投げてしまいましたが、もうクラッシュしていません。私のexifAttachmentsのNSLogは添付ファイルがないことを示しているので、何かをする前に 'captureStillImageAsynchronouslyFromConnection'が動作していることを確認してください。みんなありがとう。 – Filo

関連する問題