1

J'utilise le gestionnaire de poussée de mouvement de base pour les mises à jour de l'accéléromètre:crash avec blocs et Core mouvement

CMAccelerometerHandler accelerometerHandler =^(CMAccelerometerData *accelerometerData, NSError *error) { 
    // handle update 
}; 

[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] 
            withHandler:[[accelerometerHandler copy] autorelease]]; 

Ce code se bloque. Si je ne copie pas le bloc du tout, je me suis interrompu par intermittence sur suspension/reprise. Si je supprime le autorelease cela fonctionne très bien, mais je pense que cela va produire une fuite.

J'ai également essayé d'assigner le bloc à un ivar et de le relâcher après [motionManager stopAccelerometerUpdates]. Crashes aussi.

Comment ça se passe? J'ai toujours pensé que je devais équilibrer copy/retain avec un release/autorelease?

Voir aussi: Copying blocks (ie: copying them to instance variables) in Objective-C

Répondre

1

La question est la propriété ici sur le bloc. Quand vous considérez que les blocs ne sont en réalité que des objets, vous devez comprendre comment cela fonctionne. Vous devez copier le bloc dans le tas, mais vous devez le traiter comme tous les autres objets dont vous êtes propriétaire. Lorsque l'objet qui a appelé la copie sur le bloc est désalloué, vous devez libérer votre propriété sur le bloc.

+0

OK, stupide moi. Quand j'ai essayé l'approche ivar que j'ai décrite, j'ai assigné le bloc littéral à l'ivar, puis appelé '[motionManager startAccelerometerUpdatesToQueue: [NSOperationQueue mainQueue] avecHandler: [[accelerometerHandler copy]]'. Donc quand j'ai libéré l'ivar, j'ai essayé de libérer le bloc de pile pas le bloc de tas. Qui, bien sûr, se bloque. –

+0

Cela causerait des problèmes :) La gestion des blocs est parfois un peu étrange, mais vous avez compris –