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
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. –
Cela causerait des problèmes :) La gestion des blocs est parfois un peu étrange, mais vous avez compris –