Jan 15, 2012
Tags: xcode
Notes

initで確保してないNSStringは解放しない

これは「しなくていい」じゃなくて「しちゃいけない」。stringWithなんたらとかいう類のstringを生成して返すメソッドはNSStringのオブジェクトを先にautoreleaseしてから渡してくれるんだけど、autoreleaseされてるオブジェクトを明示的にreleaseするとエラー出てアプリごと落ちるので気を付けた方がいい。NSArrayのarrayとかNSDictionaryのdictionaryとか、クラスメソッドでオブジェクトの初期化までやってくれるやつも基本的にどれも「allocしてinitしてautorelease」相当の処理をやってるので同様。多分「変なとこでreleaseしたせいで落ちた」ってのの原因のかなりのとこがこれじゃないかと思うので、autoreleaseされてるオブジェクトにrelease送ってないか見てみるといいと思う。というか、俺がそれを頻繁にやらかしてる人のなので…。ついやっちゃう。

fladdict:
[NSString stringWithFormat:○○] みたいに alloc しないで作成されるオブジェクトは、関数名がcreateかcopyかnewではじまらない限り、autorelease がついていてイベントの終了時とかに自動で開放されるみたいです。

releaseの使いどころ - As Sloth As Possible 2008-11-02

releaseの使いどころ。メモリの辺りがどうしてもわからない。 - f-shinの日記 - iPhoneアプリ開発グループ 2008-11-02

メソッドの命名規則でautoreleaseかどうかを判断しないといけないのは面喰いますが、覚えて慣れるしかないですね。
通常(create, copy, newで始まらない場合)はautoreleaseなので、呼び出し元に返したい場合は [[NSString alloc] stringWithFormat:xxx] のようにallocが必須ということですね。

About