2008-08-29 13 views
12

Objective-Cで標準のドット表記またはメソッド呼び出しを使用して、Objective-Cでオブジェクトのプロパティにアクセスできます。Objective-Cのドット表記とメソッド呼び出しのパフォーマンスの相違

myObject.property = YES; 

または

[myObject setProperty:YES]; 

(プロパティにアクセスするという点で)性能に違いはありますか?それはコーディングスタイルの面での優先事項ですか?

答えて

19

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行の両方が同じようにコンパイルされます。しかし、それがない、すべてのメッセージが送信されていないかどうか、送信されるどのようなメッセージに変更です。

0

私が見た限りでは、この2つのパフォーマンスに大きな違いはありません。私は、ほとんどの場合、同じコードにコンパイルされることは合理的に確信しています。

ご存じない場合は、100万回程度のテストを行うテストアプリケーションを作成してください。それは確かな唯一の方法です(ただしアーキテクチャによって異なる場合があります)。

4

チェックアウトarticle from Cocoa is My Girlfriendその要点は、1つを他のものよりも上乗せすることによるパフォーマンス上のペナルティがないことです。

ただし、この表記法では、変数と変数について何が起こっているのかを確認するのが難しくなります。

4

プロパティを「非原子的」としてマークしないと、パフォーマンスの違いがわかります。 @synthesizeは自動的に同期コードをプロパティの設定に追加し、スレッドを安全に保ちますが、設定とアクセスは遅くなります。

は、このように、主に、あなたは、おそらくのようなプロパティを定義したい:

@property(アトミック、保持)NSStringの* MyPropで。

個人的には、正しい値を適切に解放することを覚えておく必要があるため、非定型セッターでも完全に自明ではない正しいセッターメソッドを書くことを考える必要がないという点で、ドット表記が一般的に役立ちます。テンプレートコードを使用すると、間違いを犯すことはありますが、一般的に、クラスを混乱させる反復コードになります。

意識しておくべきパターン:setterを自分で定義して(@ synthesizeizeを作成するのではなく)、値を設定するという副作用がある場合は、setterを通常のメソッドにする必要があります。プロパティ表記法。

意味的にプロパティを使用すると、呼び出し元への実際の値に直接アクセスするように見えます。そのようなものは、実際に両方のメッセージを送信していてもプロパティにアクセスしないでメッセージを送信することによって行います。

関連する問題