2012-04-17 6 views
0

まず、いくつかの文脈:SOの質問に答えながら、投稿者は[self.propertyGetter:newValue];に似た構文でゲッターを設定しようとしていた投稿に出会った。なんらかの理由でこれがコンパイルされ、私は自分自身に "これは無関心ではないでしょうか?"と思った。だから、私の疑問は、なぜこれは「仕事」ですか? (完全に明確にするために、ポスターは効果がないと不平を言っていたので、「仕事」によって、私はコンパイルを意味する)。ゲッターの設定は何ですか?

答えて

3

引用したコードは[self.propertyGetter:newValue]です。 Objective-Cコンパイラがこれを解析する方法は次のとおりです。

最初のものは、メッセージの受信者でなければなりません。そのコードでは、受信者はself.propertyGetterの値です。コンパイラはself.propertyGetter[self propertyGetter]に変換します。したがって、引用したコードを[[self propertyGetter]:newValue]として書き直すことができます。

コンパイラは、メッセージのセレクタを把握する必要があります。通常、setStatusBarHidden:animated:のようなキーワードセレクタが表示されます。キーワードセレクタには、コロンが続く一連のキーワードが表示されます。しかし、それはキーワードが長さゼロであることが分かります。したがって、コロン自体が有効なキーワードセレクタです。コンパイラはこれを次のように見ます:[[self propertyGetter] :newValue]。ゼロ長のキーワードを使用すると、ほとんどの場合、非常に悪いスタイルになります。

セレクタを使用してインスタンスメソッドを宣言できます。例えば:[self propertyGetter]そのメソッドを持つクラスのオブジェクトを返す場合

- (void):(NSObject *)newValue; 

は、コードがコンパイルおよび実行されます。

コンパイラはidは、ワイルドカード型であり、あなたがそれを送信しようとした場合、コンパイラは文句を言わないので、そのように命名法と任意のクラス、および[self propertyGetter]リターンが(当時のコードがコンパイルされ、idを入力見ている場合任意の既知のメッセージセレクタ)。しかし、[self propertyGetter]が実際に:メッセージを理解していないと、アプリケーションは実行時にクラッシュします。

+0

この場合、彼が設定しようとしていたのはUILabelの 'backgroundColor'プロパティでした。彼は運が良かったと思う。いつものように、あなたの優れた答えはロブにとても感謝しています。 – CodaFi

+0

私はそのコンパイル例を見たいと思っています...私は答えを信じていませんが、 '[] 'の構文のあいまいさは常に....面白かったからです。 – bbum

+0

@bbum https://github.com/mayoff/Bridging-Categories –

1

これは、すべてのobjective-Cオブジェクトがデフォルトで動的エンティティであるため、コンパイルされます。それはコンパイルされますが、実行時にクラッシュします。

Source

+0

事は、彼のためにクラッシュしなかった、それは単に効果がありません。 – CodaFi

+0

あなたが言及したように、nilに送信されたメッセージはnilを生成し、それは目的ではokです。 – Eugene

+0

だから、私はゲッターがゼロへの呼び出しであると設定しました。ありがとう。期限が過ぎると私は受け入れる。 – CodaFi

関連する問題