Objective-C アクセサメソッドの実装にありがちなミス

macノートを購入& iphone SDK をインストールして、Objective-C を研究中です。

PHP / Java などのメモリ管理の要らない言語から始めた者としては、以下のようなうっかりミスをしてしまいます。
(「基礎からのiPhone SDK」206ページの例)

- (void) setTimeZone: (NSTimeZone*) zone {
    timeZone = zone;
}


上記に対応するコードを PHP で書なら以下のようになり、何の問題もないのですが、Objective-C ではメモリ管理が正しくできません。

function setTimeZone($zone) {
    $this->zone = $zone;
}


正しくは以下のようにするらしいです。(正確な解説はCocoa メモリ管理プログラミングiphone公式ドキュメント)を参照ください)

- (void) setTimeZone: (NSTimeZone*) zone {
    if (timeZone != zone) {
        [timeZone release];
        timeZone = zone;
    }
}

上記は一例でアクセサメソッドの実装は主に3パターンあり、Cocoa メモリ管理プログラミングiphone公式ドキュメント)に詳細な解説があります。


Cocoa メモリ管理プログラミングiphone公式ドキュメント)では、Objective-Cでは独自のアクセサメソッドを実装せず、プロパティ機能( @property )を使うことが推奨されているので、下手に独自実装しないのが最善策のようです。