Сбой с блоками и движением ядра - PullRequest
1 голос
/ 12 ноября 2010

Я использую push-обработчик Core Motion для обновления акселерометра:

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

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

Этот код вылетает. Если я вообще не копирую блок, я получаю прерывистый сбой при приостановке / возобновлении. Если я уберу autorelease, он будет работать нормально, но я думаю, что это приведет к утечке.

Я также пытался присвоить блок ивару и освободить его после [motionManager stopAccelerometerUpdates]. Аварии также.

Как получается? Я всегда думал, что должен уравновесить любой copy / retain с release / autorelease?

См. Также: Копирование блоков (т.е. копирование их в переменные экземпляра) в Objective-C

1 Ответ

1 голос
/ 12 ноября 2010

Проблема здесь заключается в владении блоком. Когда вы считаете, что блоки на самом деле являются просто объектами, становится понятнее, как все это должно работать. Вам НЕОБХОДИМО скопировать блок в кучу, но затем вам нужно обращаться с ним так же, как с любым другим объектом, над которым у вас есть право собственности. Когда объект, вызвавший копию в блоке, освобожден, вы должны освободить свое владение блоком.

...