Objective-Cには非常に単純なコード行があります。
if ((selectedEntity != nil) && [selectedEntity isKindOfClass:[MobileEntity class]])
ときどき、理由もなく、EXC-BAD-ACCESSを使用してこのコード行でゲームがクラッシュします。通常、何かが競技場から削除される頃のように思われるので、selectedEntityが割り当て解除されたと推測すると、この結果になります。既存のエンティティを選択することは不可能であることに加えて(しかし、誰が知っているか、これは私のコードでは実際には当てはまらないかもしれません...)、アクセスする前に選択されたエンティティがあるかどうかを具体的にチェックしているという事実は、私がすべきではないことを意味しますここでは問題はありません。Objective-Cはブール型の短絡をサポートすることになっていますが、編集ではないようです。短絡は問題とは何の関係もないようです。
また、時々爆発していることを知っていたので、このコードブロックの周りに@ try / @ catchを配置しましたが、それは無視されているようです(EXC-BAD-ACCESSをキャッチできないと思います)。
だから基本的に私は誰かがこれを捕まえて捨てる方法を知っているのか(ゲームがクラッシュしない限りこのエラーを気にしないので)、なぜそれが起こるのか説明できるのだろうかと思っています。Objective-Cが「nil」値で奇妙なことをすることを知っているので、オブジェクトポインタでもnilでもない奇妙なスペースを指していると思います。
編集:明確にするために、私は以下のコードが間違っていることを知っています、それは私が私のプログラムで起こっていたと私が推測していたことです。私はそれが問題を引き起こすかどうか尋ねていました-それは確かにそうです。:-)
編集:消去される前にエンティティを選択できるフリンジケースがあるようです。したがって、コードの進行は次のようになります。
selectedEntity = obj;
NSAutoreleasePool *pool = ...;
[obj release];
if (selectedEntity != nil && etc...) {}
[pool release];
したがって、自動解放プールがまだ解放されていないため、オブジェクトはnilではありませんが、保持カウントは0であるため、とにかくアクセスすることはできません...またはそれらの線に沿った何か?
また、私のゲームはシングルスレッドなので、これはスレッドの問題ではありません。
編集:私は2つの方法で問題を修正しました。まず、そのフリンジケースではエンティティの選択を許可しませんでした。次に、[entities removeObjectAtIndex:i](削除されるエンティティを削除するコード)を呼び出す代わりに、次のように変更しました。
//Deselect it if it has been selected.
if (entity == selectedEntity)
{
selectedEntity = nil;
}
[entities removeObjectAtIndex:i];
jibが提案したように、変数を解放すると同時に変数にnilを割り当てていることを確認してください。