2010-11-26 5 views
2

私はDeviceMotionクラスでコーディングを開始しています。 Appleのdocumenationに従った後、私は次のようにありますiPhone Motion - EXC不正アクセス

- (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は、あなたが属していないメモリにアクセスしようとしているOSレベルの例外です。私はこれがあなたのブロックがスコープのローカルであることと関係があると考えています。それがスコープ外になると、それは破壊されます。ヒープ上にそのコピーを作成する必要があります。

有名なDave DeLongの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人しかいない:(..ありがとう、そして幸せな感謝祭。 –

関連する問題