0

私はRemoteIOを処理して、マイク入力を取得し、それらを少し変更しています。

クラッシュすることEXC_BAD_ACCESSがあり、メッセージが表示されなくなります。

クラッシュを引き起こす行はこれらです。

  int currPower = [[powers objectAtIndex:i] intValue];
  int prevPower = [[powers objectAtIndex:i - 1] intValue];

コードを説明し、

  1. 「力」はNSMutableArrayです。
  2. [powers count]常に変数「i」よりも大きかった

しばらく苦労して、私はそれを修正する良い方法を見つけました。

環境変数。

そこで、クラッシュの理由がわかるように設定NSZombieEnabledしました。NSDebugEnabled

しかし、変数を設定しても、Xcodeはメッセージを表示しません。(ただし、他の回線からクラッシュが発生した場合は、メッセージが正しく表示されます。)

また、奇妙なことに、実行開始直後にクラッシュすることはありません。平均して1分でクラッシュします。(しかし、時代は本当に異なりました。)

そして、これは少し推測です。レートを以前の半分に下げると、より安定しました。

それで、メソッドがレートの速度に追いつくことができなかっNSMutableArrayたので、それは問題ですか?NSMutableArray

または、他の考えられる理由がありますか?

================================================== =======================================

さらにいくつかのコードがあります。私はこのように力を割り当てました。

  powers = [[NSMutableArray alloc] initWithCapacity:POWER_ARRAY_SIZE];

powers配列を解放する場所は..

  - (void)dealloc {
     [powers release];
     [super dealloc];
  }

そして他のどこにもありません。

より詳細なコードはこれです。

  - (void)drawRect:(CGRect)rect
  { 
     ...//Do Something
     ...//Check "endindex" and "startindex" not to exceed boundary

     for (int i = endindex; i > startindex; i-=1)
     {

        int currPower = [[powers objectAtIndex:i] intValue];
        int prevPower = [[powers objectAtIndex:i - 1] intValue];

        ...//Doing something

     }
  }

このdrawRect:メソッドは、ミリ秒ごとにメインスレッド(タイマーによる)から呼び出しています。

--このメソッドでパワーを更新(より具体的には追加)

  - (void)setPower:(int)p
  {

     [powers addObject:[NSNumber numberWithInt:p]]; 

     while ([powers count] > POWER_ARRAY_SIZE){
        [powers removeObjectAtIndex:0];
     }
  }

また、このメソッドはミリ秒ごとに呼び出しています。これはバックグラウンドスレッドで呼び出しています。

したがって、@autoreleasepoolなしでXCodeはリークのアラートのメッセージを表示します

このため、@ autoreleasepool {..}でメソッド(setPower)をブロックしました。

4

2 に答える 2

0

NSZombies が問題を解決した場合、それはあなたNSMutableArrayがどこかで解放されているか、自動解放プールにあることを意味します。また、配列の境界外に書き込もうとしている可能性もあります。

  • が自動解放プールにある場合NSMutableArray(便利な方法で作成されたもの、または明示的に作成したもの)は、必要がなくなったときにautorelease手動で削除retainします。release
  • オブジェクトが自動解放プールにない場合は、releaseそのオブジェクトに対して が呼び出されたときにチェックします。
  • 課題の前に簡単な警告を書きます:

if( i <= 0 || i >= [powers count] ) NSLog(@"Here's the problem. i = %d", i);

于 2012-02-03T04:41:58.023 に答える
0

私は答えを見つけました。

objected-C の NSMutableArray が時々間違って ack するため、クラッシュが発生します。

それは私がそれを使ってミリ秒ごとに何かをしようとするときです.

そこで、Objective-C 配列を C 配列に変更しました。

  int power[ARRAYSIZE];

変更した後、正常に動作します。

NSMutableArray は、何かを本当に高速に行うにはそれほど軽量ではない可能性があります。

于 2012-02-15T07:23:02.320 に答える