2010-11-26 2 views
2

Я начинаю кодирование с помощью класса DeviceMotion. После выполнения documenation Apple, у меня есть следующие:iPhone Motion - EXC BAD ACCESS

- (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 в консоли.

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

ответ

3

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

Попробуйте this answer от известного Dave DeLong. Кроме того, как и при нормальных правилах управления памятью 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]; 
} 
+0

Вы, сэр, гений. Я скопировал, вставил и отлично работал. Я бы проголосовал, но я всего лишь 13 человек :(.. Спасибо, и счастливое благодарение. – 2010-11-26 03:38:41

Смежные вопросы