3

デリゲートを定義する必要があるObjective-Cコードの例をいくつか見てきました。たとえば、MapKitを使用すると、次のようなステートメントが表示されます。

[self.mapView.delegate self];

私は時々次のことも見ます:

[self.mapView setDelegate:self];

それでも私は次のことを行ういくつかの例を見つけます:

self.mapView.delegate = self;

2番目と3番目がどのように同等であるかは理解していますが、コンパイルはもちろん、最初の実行方法もわかりません。selfつまり、このコンテキストで有効なセレクターはどのようになっているのでしょうか。このコードは、デリゲートプロパティの代入ステートメントにどのように変換されますか?

4

1 に答える 1

11

self[self.mapView.delegate self];とは異なりますが、[self.mapView setDelegate:self];関連するものです。後者の自己は、使用されるスコープ内のオブジェクトを表しますが、NSObject プロトコルで定義され[object self]たメソッドです。-(id)self

ドキュメントから

self
受信者を返します。(必要)

- (id)self 

戻り値 受信者。

提供状況 OS X v10.0 以降で利用可能。

NSObject クラスは NSObject プロトコルを実装しているため、コードで使用するほぼすべてのオブジェクトがこのメソッドを理解します。

手がかり、それが何に役立つかは、GNUStepのドキュメントを提供します:

自己

- (id) self; 

可用性: OpenStep

レシーバーを返します。プロキシでは、これはプロキシされたオブジェクトを返す場合があります (必須ではありません)。

プロキシに使用できます。
また、KVC では、 と呼ばれるメソッドがあると便利です。これはself、オペレーターが正しいキー パスを必要とするためですが、実際にはオブジェクト自体が必要なものです。

NSArray *numbers = @[@1, @1, @2 ,@3, @5]
NSNumber* sum = [numbers valueForKeyPath: @"@sum.self"];

sumとなります12


[self.mapView setDelegate:self];基本的self.mapView.delegate = self;self、各 Objective-C メッセージは、少なくとも 2 つのパラメーターを受け取る C 関数に変換されます。-setDelegate:実行時に変換されます

void setDelegate(id self, SEL _cmd, id delegate)
{
    // implementation ....
} 

ここでわかるように、selfは、ランタイムによって最初のパラメーターとして渡されるオブジェクトのデフォルト名に過ぎず、メソッドが定義されているクラスのオブジェクトを参照します。

よくキーワードと言われますが、そうでselfはありません。それは単なる慣習です。C 関数、実装 IMP 型、およびセレクター SEL 型を使用して Objective-C メソッドを構築できるため、thisC++ の命名が必要な場合のように、最初のオブジェクトを別の方法で呼び出すことができます。

于 2014-05-18T18:27:32.263 に答える