Что это. Зачем кому-то (по крайней мере, как публичному API) нужен такой метод? Есть ли практическое применение для этого?
Какова цель метода -self в классах, совместимых с NSObject?
Ответ 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;
}
.... Это имело больше смысла, прежде чем я начал писать этот ответ.