3 votes

AVCaptureSession "startRunning" plante

Voici mon problème: J'ai créé une session AVCapture personnalisée qui prend des photos. Je ne suis pas sûr pourquoi, mais la troisième fois que vous appelez startRunning, cela plante. J'ai implémenté didReceiveMemoryWarning, et il n'a pas été appelé avant le plantage. J'ai également exécuté des instruments dessus et il n'y avait pas de fuites de mémoire associées à la AVCaptureSession. Il n'y avait également aucun log via la console de XCode.

Donc ma question est... est-ce un problème de mémoire même si didReceiveMemoryWarning n'a pas été appelé? Voici une partie de mon code.

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

Des idées? Si vous avez besoin de voir autre chose, demandez simplement! Merci d'avance.

1voto

torrey.lyons Points 4268

Si didReceiveMemoryWarning était correctement implémenté et qu'il n'a jamais été appelé, votre problème n'est probablement pas dû à une pénurie de mémoire. Il existe de nombreuses autres façons de provoquer un plantage lorsque vous lancez votre session de capture. Vous devriez publier davantage de votre implémentation ainsi que des détails sur le plantage pour aider à le déboguer.

Cependant, le code que vous avez posté comporte plusieurs inefficacités et problèmes de style. Notez qu'en Objective-C, les messages à nil sont parfaitement acceptables. Ainsi, dans vos méthodes viewWillDisappear et dealloc, vous pouvez et devez supprimer chaque test if pour améliorer la lisibilité. Par exemple, au lieu de :

if (cameraFlashButton) { [cameraFlashButton release]; }

utilisez simplement :

[cameraFlashButton release];

Si vous utilisez des accesseurs synthétisés de manière adéquate, il est également préférable de remplacer des lignes comme

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

par simplement

self.previewLayer = nil;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X