2016-04-09 5 views
0

ドット表記法とセッターによるプロパティの設定には微妙な違いがあるようです。私のObjective-Cのコードでオブジェクトのプロパティをドット表記法とセッターで設定する違いは何ですか?

、私は@property IDを委譲

クラスAとクラスの両方として宣言ので、クラスAまたはクラスBのインスタンスのいずれかに設定することができる特性を有しますBは同じプロパティとメソッドを持っています。 methodM1を1つまたは2つ呼び出すと、実装(機能)が異なります。私は次の行が(ドット表記法を介して直接プロパティを使用して)動作しないことがわかり

self.delegate = [[Class A alloc] init]; 
self.delegate.property1 = @"ABCD" ; //Does not work, get an error that property1 not defined on id 

しかし、次の行が

[self.delegate setPropert1:@"ABCD"] ; //works 

違いは何ですが?作品setterの場合、setProperty1メソッドに応答するクラスがあるので、コンパイラはそれを許可しますか?はい、私の元の理解であったQの答えが間違っているように見えます。私はドット表記法はセッターに置き換えられません。

Difference between setting a property directly and using its setter?

+1

最後の段落とリンクされた質問に関しては、送信者が「id」型でない限り、他の質問の答えは完全に正しいものです。 – rmaddy

+1

私は同様の質問に答えました[ここで私はその違いについてもう少し詳しく説明しました](http://stackoverflow.com/q/37179987/104790)。 –

答えて

4

問題がself.delegateidとして入力されていることです。これがidあるので

[self.delegate setProperty1:@"ABCD"]; 

コンパイラはちょうど、すべての制御を行って、このメッセージがうまくいかない場合は、プログラムがクラッシュすることができますすることができますと言って合法であるので、あなたは、idに任意のメッセージを送ることができます。

しかし、プロパティでは、このような制御の緩みはありません。プロパティーを使用するには、そのプロパティーが定義されている実際のタイプが必要です。したがって、あなたは

((ClassA*)self.delegate).property1 = // ... 

それとも

((ClassB*)self.delegate).property1 = // ... 

を言うことができる。しかし、あなたが

self.delegate.property1 = // no, because self.delegate is an `id` 

を言うことができないしかし、これは表記だけの問題です。 self.delegate.property1と言うことができても、これはちょうど[self.delegate setProperty1:]という別の方法であるため、その表記を使用できないため、何も失われません。

+0

あなたの答えは、Xcodeがなぜドット表記を許可しているのか、それ以外のものではないのかという疑問に十分答えていますが、Xcodeがドット表記に満足している場合の実際の差*は何も言及していません。 – nhgrif

+0

@nhgrif良い点;それを加えた。 – matt

+0

@nhgrif※1つの重要な違いがあります。コンパイラは、プロパティ宣言を見つけるために静的型が必要です。宣言では、アクセサー名はデフォルト以外の名前に定義されることがあります。これは、Appleのbooleanプロパティのフレームワークのケースでよく見られます。@property(getter = isHidden)BOOL hidden;この場合、 'receiver 'のために発行されるコードには実際の違いがあります。隠された 'と' [受信機の隠れた] 'コンパイラがドット表記の静的型付けを主張しているのはその理由だと思う。 –

関連する問題