2011-02-10 5 views
4

J'ai une application qui utilise AVCaptureSession pour traiter la vidéo. J'aime écrire avec zéro fuite de mémoire, et la manipulation correcte de tous les objets.Comment nettoyer AVCaptureSession dans applicationDidEnterBackground?

Voilà pourquoi ce post - How to properly release an AVCaptureSession - a été extrêmement utile - Depuis [Audience stopRunning] est asynchrone, vous ne pouvez pas arrêter la session et de continuer à libérer l'objet de maintien.

Donc c'est résolu. Voici le code:

// Releases the object - used for late session cleanup 
static void capture_cleanup(void* p) 
{ 
    CaptureScreenController* csc = (CaptureScreenController*)p; 
    [csc release]; // releases capture session if dealloc is called 
} 

// Stops the capture - this stops the capture, and upon stopping completion releases self. 
- (void)stopCapture { 
    // Retain self, it will be released in capture_cleanup. This is to ensure cleanup is done properly, 
    // without the object being released in the middle of it. 
    [self retain]; 

    // Stop the session 
    [session stopRunning]; 

    // Add cleanup code when dispatch queue end 
    dispatch_queue_t queue = dispatch_queue_create("capture_screen", NULL); 
    dispatch_set_context(queue, self); 
    dispatch_set_finalizer_f(queue, capture_cleanup); 
    [dataOutput setSampleBufferDelegate: self queue: queue]; 
    dispatch_release(queue); 
} 

Maintenant je viens pour soutenir les interruptions d'applications comme un appel téléphonique, ou en appuyant sur le bouton d'accueil. Au cas où l'application entrerait en arrière-plan, j'aimerais arrêter de capturer et faire apparaître mon contrôleur de vue.

Je n'arrive pas à le faire au contexte applicationDidEnterBackground. dealloc n'est jamais appelé, mon objet reste actif, et quand je rouvre l'application, les cadres commencent à entrer automatiquement.

J'ai essayé d'utiliser beginBackgroundTaskWithExpirationHandler mais en vain. Cela n'a pas beaucoup changé.

Des suggestions? Merci!

Répondre

0

Je n'ai pas de réponse à votre question. Mais j'ai aussi lu le thread you mentioned et j'essaye de l'implémenter. Je suis surpris que vous avez ce code dans la fonction stopCapture:

// Add cleanup code when dispatch queue end 
dispatch_queue_t queue = dispatch_queue_create("capture_screen", NULL); 
dispatch_set_context(queue, self); 
dispatch_set_finalizer_f(queue, capture_cleanup); 
[dataOutput setSampleBufferDelegate: self queue: queue]; 
dispatch_release(queue); 

Je pensais que le code était nécessaire dans le cadre de l'initialisation de la session. Est-ce que ça marche pour toi?

Est-ce que votre fonction capture_cleanup est appelée? le mien ne s'appelle pas et j'essaye de comprendre pourquoi.

+0

Salut, Ce code est en effet trouvé dans mon code de nettoyage. Peut-être une erreur de copier-coller, mais cela a fonctionné. capture_cleanup a été appelé. Je pense que je remplace la file d'attente dataOutput, et le fermer, donc le nettoyage est appelé de manière appropriée. Mais vous pouvez également demander à la personne qui a d'abord posté ce code :) GL! –

+0

Même problème dans mon cas, capture_cleanup n'est pas appelé. Une idée? – polyclick

Questions connexes