3

ここに私の問題があります。写真を撮るカスタム AVCaptureSession を作成しました。理由はわかりませんが、 を 3 回呼び出すとstartRunning、クラッシュします。を実装didReceiveMemoryWarningしましたが、クラッシュする前に呼び出されませんでした。インストルメントも実行しましたが、AVCaptureSession に関連するメモリ リークはありませんでした。XCode のコンソール経由のログもありませんでした。

didReceiveMemoryWarningだから私の質問は... が呼び出されなかったとしても、それはメモリの問題ですか? これが私のコードの一部です。

viewWillDisappear (ViewController)

- (void)viewWillDisappear:(BOOL)animated {
if (cameraFlashButton) { [cameraFlashButton release]; }
if (switchCamera) { [switchCamera release]; }
if (cameraBadgeBack) { [cameraBadgeBack release]; }
if (cameraBadgeNumber) { [cameraBadgeNumber release]; }
if (cameraUseButton) { [cameraUseButton release]; }
if (cameraOverlayView) { [cameraOverlayView release]; }
if (blackOverlay) { [blackOverlay release]; }
if (loadingIndicator) { [loadingIndicator release]; }
if (cameraPickButton) { [cameraPickButton release]; }
if (whiteOverlay) { [whiteOverlay release]; }
if (imageOverlay) { [imageOverlay release]; }
if (captureManager) { [captureManager release], captureManager = nil; }
if (theCaptureSession) { [theCaptureSession release], theCaptureSession = nil; }
[super viewWillDisappear:YES];
}

dealloc (CaptureSessionManager)

- (void)dealloc {
if ([self captureSession]) { [[self captureSession] stopRunning]; }
if (previewLayer) { [previewLayer release], previewLayer = nil; }
if (captureSession) { [captureSession release], captureSession = nil; }
if (stillImageOutput) { [stillImageOutput release], stillImageOutput = nil; }
if (stillImage) { [stillImage release], stillImage = nil; }
[super dealloc];
}

アイデア?他に何か見る必要がある場合は、お尋ねください。前もって感謝します。

4

1 に答える 1

1

が適切に実装されていて、一度も呼び出されていない場合didReceiveMemoryWarning、メモリ不足が原因ではない可能性があります。キャプチャ セッションの実行を開始したときにクラッシュする原因は他にもたくさんあります。これをデバッグするために、クラッシュの詳細とともに実装の詳細を投稿する必要があります。

ただし、投稿したコードには、多くの非効率性とスタイルの問題があります。Objective-C での nil へのメッセージはまったく問題ないことに注意してください。したがって、viewWillDisappearandメソッドでは、すべてのテストの読みやすさdeallocを削除できますし、削除する必要があります。ifたとえば、次の代わりに:

if (cameraFlashButton) { [cameraFlashButton release]; }

ちょうど使用:

[cameraFlashButton release];

適切に合成されたアクセサーを使用している場合は、次のような行を置き換えることもはるかに優れています

if (previewLayer) { [previewLayer release], previewLayer = nil; }

単純に

self.previewLayer = nil;
于 2012-07-05T20:25:54.317 に答える