一時的なインスタンスでのミスのお話し
インスタンスを作る時、init〜でなくて、例えばspriteWith〜のような一時的なインスタンスを生成するタイプで、ハマったコトがあります。
ゲームなので、初期化とループでの処理は別ですが、初期化ではちゃと動くのに、ループに入ったとたん実行時エラーが起こり、原因が判らずハマってしまいました。
カンで「詳説Objective-C」を読んで、なんとか理解して回避。いやぁ運が良かったです。
実行時エラーが起こった時にはこういう事が起こっていたのでした。
【初期化部の呼び出し】
NSApplication から呼び出される。この時、NSAutoreleasePoolのインスタンスが作成される。
【初期化部】
spriteWith〜のような一時的なインスタンスが作成されていた。このインスタンスはautoreleaseされている。
【初期化部が終って】
NSAutoreleasePoolのインスタンスがreleaseされて、初期化部でautoreleaseされた一時的なオブジェクトにはreleaseメッセージが送られる。
だものだから、ここで解放されて無くなっちゃう。
ここまでがautoreleaseされたものの寿命という事になります。
【ループ部】
無くなっちゃたオブジェクトにメッセージを送るものだから実行時エラー。
インスタンスがautoreleaseされたものか、そうでないのか、よく知っておく必要があります。
判らない時は、この実行時エラーを逆手にとって調べる方法もありますけど。
もし、autoreleaseされたものを後から使いたい時は、そのインスタンスにはretainメッセージを送っておくのをお忘れなく。
蛇足ですが、サウンドのコールバックで呼ばれたメソッド(もしくは関数)によっては、NSAutoreleasePoolのインスタンスが作成されていませんから、自前で用意する必要があります。
ここでもちょっとハマりそうになりました。