11

それでおしまい。そのようなメソッドを (少なくともパブリック API として) 必要とするのはなぜでしょうか? 実用的な用途はありますか?

4

3 に答える 3

12

このselfメソッドは、Key-Valueコーディング(KVC)に役立ちます。

KVCを使用すると、オブジェクトを辞書のように扱うことができます。次のように、プロパティの名前を含む文字列を使用して、オブジェクトのプロパティにアクセスできます[view valueForKey:@"superview"]。次のように、キーパスを含む文字列を使用してプロパティのチェーンをたどります[view valueForKeyPath:@"superview.superview.center"]

NSObjectにはメソッドがあるため、キーまたはキーパスとしてself使用できます。したがって、プログラムでキーパスを作成する場合、またはファイルからキーパスを読み取る場合は、キーとして使用すると、特殊なケースを記述しないようにすることができます。self[view valueForKey:@"self"]"self"

self次のように、述語で使用することもできます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""];
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate];

この場合、実際に(おそらくKVCを介して)メソッドNSPredicateを使用するかどうかはわかりません。selfそれは確かに可能です。

于 2012-12-15T22:36:19.400 に答える
2

なぜ「自己」が最初に追加されたのかはわかりませんが、オブジェクトへの内部ポインタを保護するのに役立ちました。Appleの公式の推奨事項は、内部ポインタを使い終わった後に[fooself]呼び出しを挿入することでした。メソッド呼び出しは機能的には何もしませんが、コンパイラーがそれまでfooを維持することを保証します。

于 2012-12-15T22:11:40.007 に答える
-1

ObjC ランタイムに関係していると思います。

objc_msgSend(autoreleasePool, sel_registerName("drain"));
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options)

最初の引数は自分自身です。それと何か関係があると思います。正直なところ、最終的には次のようになります。

id self(struct id *self, SEL _cmd) {
    return self;
}

....この回答を書き始める前に、もっと意味がありました。

于 2012-12-15T20:44:41.603 に答える