2

Objective-C 2.0でプロパティを次のように定義すると、次のようになります。

@property (readwrite, assign) NSObject *theObject;

どういうわけか、getterメソッドとsetterメソッドを作成する必要があります。私の知る限り、これには3つの選択肢があります。

  • - (NSObject *)theObject&の実装を手動でコーディングする- (void)setTheObject:(NSObject *)object
  • 両方の@synthesizeメソッドを自動的に生成するために使用する、または
  • @dynamicオーバーライドすることを選択しない2つのメソッドのいずれかを自動的に生成するために使用します。

私はこれを正しく理解していますか?@propertyまた、さまざまな引数を使用すると、 @synthesize&の結果にどのように影響します@dynamicか?(たとえば、nonatomicweak

4

2 に答える 2

2

との違いを誤解しまし@synthesize@dynamic

@synthesizegetterおよび/またはsetterがまだ手動で実装されていない場合は、プロパティのgetterおよびsetterメソッドを生成します。これはあなたが現在信じていることです@dynamic

@dynamicランタイムがゲッターとセッターを自動的に生成することを望まず、それらを手動で実装していない場合に使用されます。基本的に@dynamicは、ある種のランタイムマジックを使用して、実行時にゲッター/セッターが動的に提供されることをコンパイラーに通知しています。

たとえば、Objective-Cランタイムプログラミングガイドには次のように書かれています。

You can implement the methods `resolveInstanceMethod:` and `resolveClassMethod:` 
to dynamically provide an implementation for a given selector for an instance 
and class method respectively.

Objective-Cプログラミング言語の宣言されたプロパティのセクションを読むことをお勧めします。これにより、方法がより詳細に説明され、やなどのすべての属性と連携して機能します。@property@synthesize@dynamicnonatomicweak

于 2012-07-20T03:10:54.880 に答える
2

@dynamicアクセサメソッドが実行時に提供されることをコンパイラに通知します。

少し調べてみると、アクセサメソッドを提供すると@dynamicディレクティブがオーバーライドされることがわかりました。

@synthesizeこれらのアクセサーを作成するようにコンパイラーに指示します(ゲッターとセッター)

@propertyアクセサーが作成され、ドット表記または[object message]

于 2015-06-05T08:25:22.233 に答える