Objective-C の標準のドット表記またはメソッド呼び出しを使用して、Objective-C のオブジェクトのプロパティにアクセスできます。
myObject.property = YES;
また
[myObject setProperty:YES];
パフォーマンスに違いはありますか (プロパティへのアクセスに関して)? コーディングスタイルの好みの問題ですか?
Objective-C の標準のドット表記またはメソッド呼び出しを使用して、Objective-C のオブジェクトのプロパティにアクセスできます。
myObject.property = YES;
また
[myObject setProperty:YES];
パフォーマンスに違いはありますか (プロパティへのアクセスに関して)? コーディングスタイルの好みの問題ですか?
Objective-C でのプロパティ アクセスのドット表記は、ブラケット表記と同様にメッセージ送信です。つまり、次のようになります。
@interface Foo : NSObject
@property BOOL bar;
@end
Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];
最後の 2 行はまったく同じようにコンパイルされます。これを変更する唯一のことは、プロパティにgetter
and/orsetter
属性が指定されている場合です。ただし、メッセージが送信されるかどうかではなく、送信されるメッセージが変更されるだけです。
@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end
if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }
最後の 2 行はどちらも同じようにコンパイルされます。
Cocoa is My Girlfriend の記事をご覧ください。その要点は、一方を他方に使用してもパフォーマンスが低下しないことです。
ただし、この表記では、変数で何が起こっているのか、変数が何であるかを確認するのが難しくなります。
パフォーマンスの違いが見られるのは、プロパティを「非アトミック」としてマークしない場合のみです。@synthesize は、プロパティの設定に同期コードを自動的に追加し、スレッド セーフに保ちますが、設定とアクセスは遅くなります。
したがって、ほとんどの場合、次のようなプロパティを定義する必要があります。
@property (非アトミック、保持) NSString *myProp;
個人的には、正しいセッター メソッドを記述することを考える必要がないという観点から、ドット表記が一般的に役立つと思います。これは、古い値を適切に解放することも覚えておく必要があるため、アトミックでないセッターの場合でも完全に簡単ではありません。テンプレート コードを使用することは役に立ちますが、常に間違いを犯す可能性があり、通常、クラスを乱雑にするのは反復的なコードです。
注意すべきパターン: セッターを (@synthesize に作成させるのではなく) 自分で定義し、値を設定することによる他の副作用が発生し始める場合は、プロパティ表記を使用して呼び出すのではなく、おそらくセッターを通常のメソッドにする必要があります。
意味的にプロパティを使用することは、呼び出し元への実際の値への直接アクセスであるように見えます。したがって、それと異なることはすべて、プロパティにアクセスするのではなく、メッセージを送信することによって行う必要があります (実際には両方ともメッセージを送信しているにもかかわらず)。
CocoawithLoveに関するこのブログ投稿も読んでください。
http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html
そこで、作成者はNSManagedObjectのカスタムアクセサーとドット表記の速度を比較しましたが、違いはありません。ただし、KVCアクセス(setValue:forKey:)は約2倍遅いようです。
私が見た限りでは、この 2 つの間に大きなパフォーマンスの違いはありません。ほとんどの場合、同じコードに「コンパイル」されることは間違いありません。
よくわからない場合は、各メソッドを 100 万回程度実行するテスト アプリケーションを作成してみてください。これが確実な唯一の方法です (ただし、アーキテクチャによって異なる場合があります)。