2010-11-26 6 views
2

Je commence à coder avec la classe DeviceMotion. Après avoir suivi les Documenation d'Apple, je donne les résultats suivants: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!"); 
    } 

Ce code fonctionne très bien, mais quand je veux faire tout code sauf un NSLog (même quelque chose d'aussi simple que incrémenter un entier) à la place du ' référence A ', je reçois un mauvais accès EXEC dans la console.

J'ai regardé autour de moi, et tout ce que j'ai trouvé, c'est que c'est une sorte de fuite de mémoire. Est-ce que quelqu'un sait ce qui se passe? Si non, comment puis-je comprendre? Je suis assez inexpérimenté avec les instruments, mais si je suis pointé dans la bonne direction, je serais très apprécié.

Répondre

3

EXC_BAD_ACCESS est une exception au niveau du système d'exploitation, ce qui signifie que vous essayez d'accéder à la mémoire qui ne vous appartient pas. Je pense que cela a quelque chose à voir avec le fait que votre bloc est local à la portée, donc une fois qu'il est hors de portée, il est détruit. Vous devez en créer une copie sur le tas. Essayez le this answer du célèbre Dave DeLong. En outre, comme avec les règles de gestion de la mémoire Cocoa normales, n'oubliez pas de release si vous avez fait une copie.

Par exemple:

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

Vous, monsieur, êtes un génie. J'ai copié et collé et travaillé parfaitement. Je voterais, cependant je suis seulement 13 rep :(Merci et bonne action de grâce. –