Objective-Cで標準のドット表記またはメソッド呼び出しを使用して、Objective-Cでオブジェクトのプロパティにアクセスできます。Objective-Cのドット表記とメソッド呼び出しのパフォーマンスの相違
myObject.property = YES;
または
[myObject setProperty:YES];
(プロパティにアクセスするという点で)性能に違いはありますか?それはコーディングスタイルの面での優先事項ですか?
Objective-Cで標準のドット表記またはメソッド呼び出しを使用して、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
および/またはsetter
属性が指定されている場合のみです。
@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end
if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }
最後の2行の両方が同じようにコンパイルされます。しかし、それがない、すべてのメッセージが送信されていないかどうか、送信されるどのようなメッセージに変更です。
私が見た限りでは、この2つのパフォーマンスに大きな違いはありません。私は、ほとんどの場合、同じコードにコンパイルされることは合理的に確信しています。
ご存じない場合は、100万回程度のテストを行うテストアプリケーションを作成してください。それは確かな唯一の方法です(ただしアーキテクチャによって異なる場合があります)。
チェックアウトarticle from Cocoa is My Girlfriendその要点は、1つを他のものよりも上乗せすることによるパフォーマンス上のペナルティがないことです。
ただし、この表記法では、変数と変数について何が起こっているのかを確認するのが難しくなります。
プロパティを「非原子的」としてマークしないと、パフォーマンスの違いがわかります。 @synthesizeは自動的に同期コードをプロパティの設定に追加し、スレッドを安全に保ちますが、設定とアクセスは遅くなります。
は、このように、主に、あなたは、おそらくのようなプロパティを定義したい:
@property(アトミック、保持)NSStringの* MyPropで。
個人的には、正しい値を適切に解放することを覚えておく必要があるため、非定型セッターでも完全に自明ではない正しいセッターメソッドを書くことを考える必要がないという点で、ドット表記が一般的に役立ちます。テンプレートコードを使用すると、間違いを犯すことはありますが、一般的に、クラスを混乱させる反復コードになります。
意識しておくべきパターン:setterを自分で定義して(@ synthesizeizeを作成するのではなく)、値を設定するという副作用がある場合は、setterを通常のメソッドにする必要があります。プロパティ表記法。
意味的にプロパティを使用すると、呼び出し元への実際の値に直接アクセスするように見えます。そのようなものは、実際に両方のメッセージを送信していてもプロパティにアクセスしないでメッセージを送信することによって行います。
はまた、愛とココアで、このブログの記事をお読みください。
ありhttp://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html
著者はNSManagedObjectのカスタムアクセサとドット表記の速度を比較し、有意差を見つけていません。しかし、KVCアクセス(setValue:forKey :)は約2倍遅く表示されます。