Какова цель метода -self в классах, совместимых с NSObject?

Что это. Зачем кому-то (по крайней мере, как публичному API) нужен такой метод? Есть ли практическое применение для этого?

Ответ 1

Метод self полезен для кодирования с ключом (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];

Я не знаю, действительно ли NSPredicate использует метод self (возможно, через KVC). Это, безусловно, возможно.

Ответ 2

Я не уверен, почему первоначально было добавлено "я", но одна вещь, к которой это пригодилась, - это защита внутренних указателей объектами. Официальная рекомендация Apple заключалась в том, чтобы вставить [foo self] вызов после того, как вы закончите с указателем интерьера; вызов метода не выполняет ничего функционального, но гарантирует, что компилятор будет поддерживать foo до тех пор.

Ответ 3

Я думаю, что это связано с временем выполнения 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;
}

.... Это имело больше смысла, прежде чем я начал писать этот ответ.