明示的でないautoreleaseでハマった

困惑

とあるメソッド内でこんな配列を宣言したとする。

NSMutableArray *Array = [NSMutableArray array];

他のメソッドで、このArrayを参照しようとした。するとiPhoneシミュレータでみごとに落ちてくれた。
なにもログを吐かずにスッと落ちる場合は、release済みのインスタンスにメッセージを送っている場合が多い、経験上。
コードを精査してみたが、Arrayを明示的にreleaseしている箇所はない。
ハマった。
1年くらいobjc書いてて今さら。悔しい。

戒め

ここでは、NSArrayクラスのarrayメソッドを使って初期化をArrayの初期化をしたのが罠。
クラスメソッド(コンビニエンスコンストラクタ)によって生成されるインスタンスは、参照カウント1でautoreleaseとなっている。

そのため、他のメソッドでArrayを参照しようとした場合、いつの間にかreleaseされてしまっているインスタンスにメッセージを送ろうとしていて落ちたのであった。

解決

NSMutableArray *Array = [[NSMutableArray alloc] init];

見慣れた形式。

総括

Objective-Cのクラスメソッド(コンビニエンスコンストラクタ)には注意。