11

就是这样。为什么有人想要(至少作为公共 API)这样的方法?它有什么实际用途吗?

4

3 回答 3

12

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)。这当然是可能的。

于 2012-12-15T22:36:19.400 回答
2

我不确定为什么最初添加了“self”,但它确实派上用场的一件事是保护指向对象的内部指针。Apple 的官方建议是在完成内部指针后插入 [foo self] 调用;该方法调用在功能上没有任何作用,但确保编译器在此之前保持 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)

第一个参数是self。我认为这与此有关。老实说,虽然它最终会变成:

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

....在我开始写这个回复之前,这更有意义。

于 2012-12-15T20:44:41.603 回答