インスタンス変数の生成と解放

http://blog.livedoor.jp/faulist/archives/1051536.html
http://ameblo.jp/xcc/entry-10400027873.html

インスタンス変数としてヘッダで宣言した変数は、deallocメソッドにてreleaseするのがメモリ管理の基本です。でも、後にreleaseするということは、allocで生成しておかないといけないんですね…。

message sent to deallocated instance

というエラーメッセージがでて落ちまくりました。ファクトリメソッドで生成したものはautoreleaseされてしまうので、deallocがコールされたときにはもうそんな変数ないよ、ってことですよね。今まで意識しないでやってきたけど全く気づかなかったな〜。

NSStringのインスタンス変数を使ったアプリが落ちまくったことで気づきました。参考サイトの中で「autoreleaseされたオブジェクトにreleaseを送ってはいけない。」という鉄則が書いてありました!なるほど〜、そのせいですね。deallocメソッドの中でreleaseしていたのをやめたことでめでたく解決、としようと思ったのですが、これだとメソッドを抜けた後に再び別のメソッドで使おうとすると解放済みになっている可能性があるので、retainしておく必要があるんですか。

string = [NSString stringWithString:@"hoge"]; //stringはインスタンス変数
[string retain];

としといて、deallocメソッドでreleaseすればよいわけです。これで無事解決!

ちなみにarrayという配列からNSStringを取り出して格納する場合、記述の方法でretainCountが変わるようです。

string = [array objectAtIndex:0]; //retainCount = 2
string = [NSString stringWithString:[array objectAtIndex:0]]; //retainCount = 1