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


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


11832
2017-12-15 20:14


起源

那么,为什么不......?
问题是“为什么有人想......”或“目的是什么......”,而不是“它为什么存在?” - Matoe
这似乎是一个有效的问题。为什么是downvotes? - Nikolai Ruhe
@ H2CO3和@John - 你有没有实际的理由使用 self 方法?我很好奇这个有用的时候。为什么我需要打电话 [self self] 要么 [someObject self]?在这个问题之前,我甚至没有注意到这种方法存在。 - rmaddy
我纯粹是通过懒惰在cycript中使用它。 view = [array [1] view];然后我将索引删除到索引2并且它是一个视图,因此没有视图方法。而不是必须返回并删除我倾向于将其重写为[array [2] self]的行,尤其是当我必须再次更改第3个索引时。 - Kyle Howells


答案:


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


12
2017-12-15 22:36



“SELF”被记录为NSPredicates中的一个特殊常量,如“nil”,“NULL”和其他一些常量。它可以映射到实际的“自我”方法,但对我来说,文档暗示它是特殊的。 - Wade Tregaskis


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


2
2017-12-15 22:11





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

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


-1
2017-12-15 20:44