iOS – App s'écraser après l'avertissement de la memory – Instruments ne montrant aucune fuite

Je travaille sur une application, qui utilise un AVCaptureSession , pour montrer le stream video "en direct" de la camera de l'appareil. J'utilise également les methods AVCaptureVideoDataOutputSampleBufferDelegate pour capturer des images fixes ( UIImage ) à partir du sampleBuffer pour travailler avec ces images pendant que la video est encore affichée sur l'écran (en utilisant OpenCV ). Quoi qu'il en soit, il y a beaucoup de code, beaucoup plus que ce que je pourrais coller ici, mais ce n'est vraiment pas le but.

L'application affichera un avertissement de la memory après quelques secondes et quelques secondes plus tard, se briser silencieusement. J'ai essayé d'utiliser des Instruments pour inspecter les fuites et l'allocation de memory, mais il n'y a rien de suspect, pas de fuites du tout et l'utilisation de la memory ne dépasse jamais 5Mo (octets global et live).

Comment puis-je savoir pourquoi l'avertissement de memory est déclenché?

EDIT: J'ai essayé d'append quelques fuites intentionnelles au code, qui apparaîtront dans Instruments, donc ça semble fonctionner en théorie …

Je crois que le problème que vous rencontrez est lié à l'utilisation de UIImage et de la mise en memory tampon d'Apple. J'ai eu un problème similaire lors de l'utilisation des fonctions PDF d'iOS. Comme vous n'avez CGImageRelease() aucun code, tout ce que je peux suggérer est de lancer des commands de release ( CGImageRelease() , CGContextRelease() etc.) et de toujours garder à l'esprit la différence entre une reference et datatables réelles.

Je viens de find la raison, même si je ne comprends pas pourquoi Instruments ne montre pas ça …

J'ai utilisé [t performSelectorInBackground:sel withObject:[self imageFromSampleBuffer:sampleBuffer]];

dans

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

méthode. Après avoir commenté cela, l'application fonctionnerait bien. Donc, le problème ici était, bien que j'aie utilisé un NSLock dans le sélecteur, l'application engendrerait de plus en plus de threads pour chaque sélecteur jusqu'à ce que la limite de memory soit atteinte. Donc la solution ici est d'utiliser un verrou avant d'exécuter le sélecteur, pas à l'intérieur de la méthode du sélecteur.

Merci pour votre aide.