在符合NSObject的类中-self方法的目的是什么?

时间:2012-12-15 20:14:43

标签: objective-c nsobject foundation

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

3 个答案:

答案 0 :(得分:12)

self方法对键值编码(KVC)非常有用。

使用KVC,您可以将对象视为字典。您可以使用包含属性名称的字符串来访问对象的属性,如下所示:[view valueForKey:@"superview"]。您使用包含键路径的字符串向下走一系列属性,如下所示:[view valueForKeyPath:@"superview.superview.center"]

由于NSObjectself方法,您可以使用self作为密钥或关键路径:[view valueForKey:@"self"]。因此,如果您以编程方式构建密钥路径,或者从文件中读取密钥路径,则使用"self"作为密钥可以避免编写特殊情况。

您还可以在谓词中使用self,如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""];
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate];

在这种情况下,我不知道NSPredicate是否实际使用self方法(可能是通过KVC)。这当然是可能的。

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

我认为这与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;
}

....在我开始撰写此回复之前,它更有意义。