1

私はセマンティクスについて疑問に思っています。何かが本当にオブジェクトの「プロパティ」になるのはいつですか? 多くの Apple の API で、プロパティを使用する代わりにゲッターとセッターを明示的に定義していることに気付きました (たとえばURL、/ ; 確かsetURLにURL は URL 要求の「プロパティ」のように見えますよね?)私が見逃していること、またはAppleがプロパティをあまり好まない場合。=PNSURLRequestNSMutableURLRequest

更新: iOS 8 の時点で、Apple は非プロパティの getter と setter のほとんど (すべてではないにしても) をプロパティに変換しました。(おそらく、Swift との互換性が容易になるようにするためです。)

4

2 に答える 2

8

または、Apple がプロパティをあまり好まない場合。

本当の原因は、Foundation フレームワークのほとんど (クラスについて話していることを忘れないようにしましょうNS*) がゴミのように古いことです。キーワードをスポーツする@property- プロパティをエミュレートするには、プログラマーが getter メソッドと setter メソッドを手動で宣言して実装する必要があり、これは Apple のコードにも当てはまりました。

現在、Foundation フレームワークは非常に基本的なものであるため、あまり変更されていません。根本的に書き直されたわけではなく、私の知る限り、それを書いたプログラマーは、新しい構文を使用してすべてのコードを書き直す必要はありませんでした。最近追加されたクラスは、実際には getter と setter の代わりに宣言されたプロパティを備えていることがわかりますが、それは古いクラスには当てはまりません。

とにかく、手動で宣言されたプロパティと and を使用して宣言されたプロパティ@property@synthesize完全に同等です。そうは言っても、それらにアクセスする際には非常に小さな違いがありますが、それは宣言に属していません:

someObject.someProperty

コードでは、someObjectは完全で具体的な型を持っている必要があるため、名前が付けられたプロパティsomePropertyが存在しない場合は、コンパイラ エラーが発生します。対照的に、

[someObject someProperty]

[someObject setSomeProperty:]

宣言されていない場合でも、メソッド呼び出しを許可します。

編集:

それらの意味的な違いは何ですか

したがって、「セマンティックな違い」とは、「動作が異なるか」ではなく、「いつ使用する必要があるか」を意味していました。分かりました。ええと...概念的には、プロパティは状態を表します。プロパティは、時間の経過とともに変化するオブジェクトの特定の特性です。Objecive-C のアクセサメソッドを使用してプロパティにアクセスすることは、無関係な事実です。

オブジェクトに対して動作するメソッドを作成する場合 (もちろんプロパティの設定以外)、それをメソッドとして宣言して呼び出す必要がある可能性がかなりあります。オブジェクトの属性にアクセス (読み取りまたは書き込み) する場合、それはプロパティのタスクにより適しています。

于 2013-03-09T18:48:16.510 に答える
1

ゲッターとセッターを使用すると、メッセージを使用してアイテムにアクセスできます

[myObject someProperty]また[myObject setSomeProperty: someNewValue]

何かを a@propertyにすると、ドット表記を使用してゲッターとセッターを呼び出すことができるようになります。これは@property、クラスのキー値コーディングが特定の値に準拠するようにするメソッド名を が選択するためです。

myObject.someProperty またmyObject.someProperty = someNewValue

これを手動で行うことは可能@propertyですが、ドット表記を使用する場合はベスト プラクティスと見なされます。@property時間の経過とともに、との舞台裏の動作は、@synthesize特に関連付けられたポインタのストレージの自動作成に関してかなり変化しました。を使用@propertyすると、コードをほとんどまたはまったく変更せずに、Apple の規則の変更に簡単に対応できます。

さらに、を使用@propertyすると、コードが読みやすくなります。

于 2013-03-09T18:41:29.710 に答える