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 )を使うことが推奨されているので、下手に独自実装しないのが最善策のようです。