私はRemoteIOを処理して、マイク入力を取得し、それらを少し変更しています。
クラッシュすることEXC_BAD_ACCESS
があり、メッセージが表示されなくなります。
クラッシュを引き起こす行はこれらです。
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
コードを説明し、
- 「力」は
NSMutableArray
です。 [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)をブロックしました。