2012-03-15 8 views
2

私は現在、客観的なことを学んでいます。正確に物事の周りの四角形の括弧は意味し、それを使用して期間を使用すること(私は.NETの世界からですので、これは私にとってはより簡単になります)との間に何らかの違いがあります。objective-cの[myString length]とmyString.lengthの違いは何ですか?

ありがとうございました。

答えて

1

Objective-Cはメソッドではなくメッセージを使用します。これは主な構文です(単純なget/setメッセージの代わりにドット構文が導入されました)。メソッドとメッセージの間には明らかに大きな類似点がありますが、違いもあります。

Objective-Cでは、オブジェクトは実行時にメッセージに柔軟に応答できます。たとえば、別のオブジェクトにプロキシするなど、まったく予期しないメッセージを処理できます。また、実行時にメッセージを列にマップするようなこともできます。これはSmalltalkに戻ってくる伝統に基づいています。

.NETはだけdynamic/DynamicObject/IDynamicMetaObjectProviderでこのような柔軟性を得ました。もちろん、どちらの言語でも、コンパイル時に定義されたメソッド/メッセージ名が通常より適切です。しかし、動的なものには顕著なユースケースがあります。

もちろん、Objective-CはCのスーパーセットなので、.は他のもの(一般的には構造体または共用体)に使用されます。

3

あなたの例ではどちらも同じことをしています。 .は、オブジェクトのプロパティにアクセスするための略語の一種です。 []は、オブジェクトにメッセージを送信するために使用されます。あなたの例では、それらは同じことです。プロパティ名に直接マッピングされていないメッセージを送信しようとすると、その違いがわかります。

たとえば

[myString length]myString.lengthは同じですが、あなたはしたい場合長さ(のは、それはたとえばのために理にかなっていると仮定しましょう)、あなたは[myString setLength:newLength]またはmyString.length = newLengthような何かをする必要があると思いますし。

[myString stringByReplacingOccurrencesOfString:@"hello" withString:@"world"]; 

.速記を使用して有意な等価物を有していない。この例のように - それに加えて、プロパティ名と同じではないメッセージがあります。

+0

興味深いことに、メッセージがプロパティ名にマップされていなくても、dot演算子を介して引数なしのメッセージをオブジェクトに送ることができるように、コンパイラ_used_を使用すると誓っていました。もちろん、私はそれをやったことはありません... –

+0

それは可能です - 私はそれを試していない。私はそれが良いアイデアだろうとは思わないでしょう。私は確かにその行動に依存しているプログラムを書くことを望まないでしょう。 –

+0

@Carl:コンパイラは確かにそれを許可します。読み取り専用のプロパティと正しい戻り値を持つパラメータのないメソッドを区別しません。結局のところ、プロパティのゲッターは、パラメータのないメソッドです。結局、 'myArray.count;'は実際に '[myArray count];'を実行します。 –

関連する問題