2010-11-26 85 views
2

我開始使用DeviceMotion類進行編碼。下面的蘋果documenation後,我有以下幾點: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從着名的戴夫德隆。此外,與正常的可可內存管理規則一樣,如果您製作了副本,請不要忘記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