Cocoa を使った優れたプログラミング手法についての質問です。
クラスの 1 つのプロパティでメソッドを呼び出したい場合、KVC を使用してレシーバーを取得する必要がありますか?それとも単にプロパティの名前を入力する必要がありますか?
例、KVC:
[[self property] myMethod];
簡単な例:
[property myMethod];
ありがとう!
Cocoa を使った優れたプログラミング手法についての質問です。
クラスの 1 つのプロパティでメソッドを呼び出したい場合、KVC を使用してレシーバーを取得する必要がありますか?それとも単にプロパティの名前を入力する必要がありますか?
例、KVC:
[[self property] myMethod];
簡単な例:
[property myMethod];
ありがとう!
例、KVC:
[[self property] myMethod];
それはKVCではありません。KVC の方法は次のとおりです。
[[self valueForKey:@"myProperty"] myMethod]
コンパイル時にプロパティがわかっている場合は、これを行う理由はありません。プロパティ値または ivar 値を直接要求できます。KVO と (Mac では) バインディングが既に実装されているため、KVO とバインディングが KVC を使用するため、KVC を直接使用する理由はあまりありません。
簡単な例:
[property myMethod];
これはプロパティにアクセスしません。ivar にアクセスします。
アクセサーメッセージをプロパティの所有者に送信する場合にのみ、プロパティにアクセスしています(self例では)。[self property]またはを使用するかどうかは関係ありませんself.property。これらは同等であるためです。どちらもpropertyへのメッセージでselfあり、それが暗示するあらゆる副作用があります。
それが重要な違いです。アクセサーをヒットすると副作用が発生する可能性がありますが、ivar に直接アクセスすると副作用が発生することはありません。
したがって、ベスト プラクティス: すべてのインスタンス メソッドでプロパティを使用します (おそらくアクセサーの副作用が必要なため)。(原則として、半分初期化されたオブジェクトまたは半分ロック解除されたオブジェクトにメッセージを送信しないでください。例外は、init/dealloc プロセスの一部としてメソッドを明示的にコメントし、そのため、安全に使用できるように記述した場合です。そのような状況。)initdealloc
ファンキーなゲッターからの副作用を保証するので、正式なバージョンは技術的に正しいと思います。(念のため、を含むカスタムゲッターを作成し、NSLog("in getter!")それが機能するかどうかをお知らせください。)
設定には、[self setProperty:foo];asを使用property = fooしてセッターをバイパスする必要があり、メモリリークが発生する可能性があります。
より自然に感じる場合、ドット表記(たとえば、self.propertyおよび)はおよびself.property = fooと同じです。 [self property][self setProperty:foo]