就是这样。为什么有人想要(至少作为公共 API)这样的方法?它有什么实际用途吗?
3 回答
该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)。这当然是可能的。
我不确定为什么最初添加了“self”,但它确实派上用场的一件事是保护指向对象的内部指针。Apple 的官方建议是在完成内部指针后插入 [foo self] 调用;该方法调用在功能上没有任何作用,但确保编译器在此之前保持 foo 。
我认为这与 ObjC 运行时有关。
objc_msgSend(autoreleasePool, sel_registerName("drain"));
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options)
第一个参数是self。我认为这与此有关。老实说,虽然它最终会变成:
id self(struct id *self, SEL _cmd) {
return self;
}
....在我开始写这个回复之前,这更有意义。