iPhone Motion — ИСКЛ. НЕПРАВИЛЬНЫЙ ДОСТУП

Я начинаю писать код с помощью класса DeviceMotion. После выполнения документации Apple у меня есть следующее:

- (void)viewDidLoad {
    [super viewDidLoad];
    myMM = [[CMMotionManager alloc] init];
    myMM.deviceMotionUpdateInterval = 1.0/30.0;
    theQ = [[NSOperationQueue currentQueue] retain];


    motionHandler = ^ (CMDeviceMotion *motionData, NSError *error) {
        if (motionData.rotationRate.z > 5.5 || motionData.rotationRate.z < -5.5) {
            NSLog(@"Rotation of Z.");  // Reference A       
        }
    };

-(IBAction)toggleClick{
    NSLog(@"toggle");

    if(myMM.gyroAvailable){

        if(myMM.deviceMotionActive){
            NSLog(@"Stopping Motion Updates..");
            [myMM stopDeviceMotionUpdates];
        } else {
            NSLog(@"Starting Motion Updates..");
            [myMM startDeviceMotionUpdatesToQueue:theQ withHandler:motionHandler];
        }

    }
    else {
        NSLog(@"No motion available. Quit!");
    }

Этот код работает нормально, однако, когда я хочу выполнить любой код, кроме NSLog (даже что-то такое простое, как увеличение целого числа) вместо «ссылки A», я получаю EXEC Bad Access в консоль.

Я осмотрелся, и все, что я нашел, это то, что это своего рода утечка памяти. Кто-нибудь знает, что происходит? Если нет, то как я могу это понять? Я довольно неопытен с инструментами, но если я укажу в правильном направлении, я был бы очень признателен.


person Rubber Duck    schedule 26.11.2010    source источник


Ответы (1)


EXC_BAD_ACCESS — это исключение уровня ОС, означающее, что вы пытаетесь получить доступ к памяти, которая вам не принадлежит. Я думаю, что это как-то связано с тем, что ваш блок является локальным для области, поэтому, как только он выходит за рамки, он уничтожается. Вам нужно создать его копию в куче.

Попробуйте этот ответ от известного Дейва Делонга. Кроме того, как и в случае с обычными правилами управления памятью Cocoa, не забудьте release, если вы сделали копию.

Например:

motionHandler = Block_copy(^ (CMDeviceMotion *motionData, NSError *error) {
    if (motionData.rotationRate.z > 5.5 || motionData.rotationRate.z < -5.5) {
        NSLog(@"Rotation of Z.");  // Reference A       
    }
});


// and then later:

- (void) dealloc
{
    [motionHandler release];
    //and all others.
    [super dealloc];
}
person dreamlax    schedule 26.11.2010
comment
Вы, сэр, гений. Я скопировал и вставил и работал отлично. Я бы проголосовал, однако у меня всего 13 представителей :(.. Спасибо и счастливого благодарения. - person Rubber Duck; 26.11.2010