iPhone Motion - EXC ПЛОХОЙ ДОСТУП - PullRequest
2 голосов
/ 26 ноября 2010

Я начинаю кодировать с класса 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 в консоли.

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

1 Ответ

3 голосов
/ 26 ноября 2010

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

Попробуйте этот ответ от известного Дэйва Делонга.Также, как и в случае с обычными правилами управления памятью Какао, не забудьте 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];
}
...