2010-11-26 8 views
2

Ich fange an, mit der DeviceMotion-Klasse zu codieren. Nach dem folgende Apples documenation, habe ich folgende: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!"); 
    } 

Dieser Code funktioniert gut, aber wenn ich jeden Code außer einem NSLog (sogar etwas so einfach wie Inkrementieren eine ganze Zahl) anstelle der "tun will Referenz A ', bekomme ich einen EXEC Bad Access in der Konsole.

Ich habe mich umgesehen, und alles, was ich gefunden habe, ist, dass es ein Speicherleck von Arten ist. Weiß jemand was los ist? Wenn nicht, wie kann ich es herausfinden? Ich bin mit Instrumenten ziemlich unerfahren, aber wenn ich in die richtige Richtung zeige, würde ich sehr geschätzt werden.

Antwort

3

EXC_BAD_ACCESS ist eine Ausnahme auf Betriebssystemebene, was bedeutet, dass Sie versuchen, auf Speicher zuzugreifen, der Ihnen nicht gehört. Ich denke, das hat etwas damit zu tun, dass dein Block lokal für den Bereich ist, also wird er zerstört, sobald er außer Reichweite ist. Sie müssen eine Kopie davon auf dem Heap erstellen.

Versuchen Sie this answer von dem renommierten Dave DeLong. Vergessen Sie auch nicht, wie bei den normalen Cocoa-Speicherverwaltungsregeln, release, wenn Sie eine Kopie erstellt haben.

Zum Beispiel:

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

Sie, Sir, sind ein Genie. Ich kopierte und klebte und arbeitete perfekt. Ich würde abstimmen, aber ich bin nur 13 rep :(.. Danke und glücklicher Dank. –