2010年3月25日木曜日

Objective-Cの「release」は「責任放棄」というニュアンスが近いかも

iPhoneアプリの開発で、前から奇妙に思っていたことがある。例えばこういうコード。

FlipsideViewController *fvc = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
[self presentModalViewController:fvc animated:YES];
[fvc release];

FlipsideViewControllerを作成してモーダルで表示した後、いきなりreleaseしている。でもこうすることになってるので、理解出来ていないまでも黙ってこうしてきた。

ここでの疑問は「表示してる最中にrelease(破棄)していいの?」ということだ。

iPhone OS View Controller プログラミングガイド」(PDF, p37)を読んでやっとわかった。

・・・各ビューを作成した直後に開放するというのは、奇妙に思われるかもしれません。しかし、ビューをビュー階層に追加するか、ビューへの参照を保存したら、開放することこそがまさに行うべきことです。どのオブジェクトも作成時の保持カウントの初期値は1です。親ビューは自動的にサブビューを保持するため、子ビューを親ビューに追加したら子ビューを開放しても安全です。・・・・各ビューを開放することは、所有権を適切な場所に移して、後でそのオブジェクトの解放漏れが生じるのを防止することを意味します。・・・

つまり、「release」は「破棄」ではなく、「開放」というより「責任放棄」というニュアンスの方が近いかもしれない。