一時的なインスタンスでのミスのお話し

 インスタンスを作る時、init〜でなくて、例えばspriteWith〜のような一時的なインスタンスを生成するタイプで、ハマったコトがあります。

 ゲームなので、初期化とループでの処理は別ですが、初期化ではちゃと動くのに、ループに入ったとたん実行時エラーが起こり、原因が判らずハマってしまいました。
 カンで「詳説Objective-C」を読んで、なんとか理解して回避。いやぁ運が良かったです。

 実行時エラーが起こった時にはこういう事が起こっていたのでした。


【初期化部の呼び出し】
 NSApplication から呼び出される。この時、NSAutoreleasePoolのインスタンスが作成される。

【初期化部】
 spriteWith〜のような一時的なインスタンスが作成されていた。このインスタンスはautoreleaseされている。

【初期化部が終って】
 NSAutoreleasePoolのインスタンスがreleaseされて、初期化部でautoreleaseされた一時的なオブジェクトにはreleaseメッセージが送られる。
 だものだから、ここで解放されて無くなっちゃう。
 ここまでがautoreleaseされたものの寿命という事になります。

【ループ部】
 無くなっちゃたオブジェクトにメッセージを送るものだから実行時エラー。


 インスタンスがautoreleaseされたものか、そうでないのか、よく知っておく必要があります。
 判らない時は、この実行時エラーを逆手にとって調べる方法もありますけど。

 もし、autoreleaseされたものを後から使いたい時は、そのインスタンスにはretainメッセージを送っておくのをお忘れなく。

 蛇足ですが、サウンドのコールバックで呼ばれたメソッド(もしくは関数)によっては、NSAutoreleasePoolのインスタンスが作成されていませんから、自前で用意する必要があります。
 ここでもちょっとハマりそうになりました。