而已。为什么有人想要(至少作为公共API)这样的方法?它有什么实际用途吗?
而已。为什么有人想要(至少作为公共API)这样的方法?它有什么实际用途吗?
该 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)。这当然是可能的。
我不确定为什么“自我”最初被添加,但它确实派上用场的一件事是保护内部指针指向对象。 Apple的官方建议是在你完成内部指针后插入一个[foo self]调用;方法调用在功能上没有任何作用,但确保编译器在此之前保持foo。
我认为这与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;
}
....在我开始写这个回答之前,它更有意义。