この議論に続いて、私は悪いアクセスの問題に遭遇しました。
ループにはいくつかのステップがあります:a、b、c、... x、y、z:
-(void)cycle:(float)delta{
[self stepA]
[self stepB]
// etc.
[self stepZ]
}
ある時点で、ステップxは次のことを行います。
// IRQ is an NSMutableArray
// Self is a reference to the engine running the cycles
[IRQ addObject:^{ NSLog(@"hello! %@", self); } ];
後で、ステップzは、すべての「遅延」呼び出しを処理することです。
for (int i = 0; i < [IRQ count]; i++){
void (^delayedCall)(void) = [IRQ objectAtIndex:i];
delayedCall();
}
[IRQ removeAllObjects];
結果:EXEC_BAD_ACCESS
ここで、ステップxが次のようにオブジェクト参照のないプレーンな文字列のみを追加する場合、ステップZは正常に機能します。
[IRQ addObject:^{ NSLog(@"hello!"); } ];
最後の観察では、同じステップが両方ともキューにブロックを追加し、キューを繰り返してブロックを実行する場合、問題は発生しません。オブジェクトへの参照がステップとして「失われる」ように:メソッドは残っていますか?
私はこの分野についてあまり理解していないので、もっと助けが必要です!
編集:ジェームズ、その参照サイクルを避けるために次のことを試みました:
NSString *userName = @"James";
[IRQ addObject:^{ NSLog(@"hello %@", userName); } ];
そしてそれも起こります。あなたのソリューションはこれにどのように適用されますか?
前もって感謝します!