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

11

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


1
问题是“为什么有人想要…”或“什么是目的…”,而不是“它为什么在那里?” - Matoe
1
这似乎是一个有效的问题。为什么会有负评? - Nikolai Ruhe
这是非常开放式的问题...没有一个真正的直接答案。就像@H2CO3所问,为什么有人会不想要它呢? - John
没有真正的理由。它在那里,也许可以使用。但是没有理由不使用它。 - Josiah
1
@H2CO3和@John - 你们有没有实际使用self方法的理由?我也很好奇这个方法什么时候会有用。为什么我需要调用[self self][someObject self]?在这个问题之前,我甚至都没有注意到这个方法的存在。 - rmaddy
1
我纯粹是因为懒才在cycript中使用它。view = [array[1] view]; 然后我将索引降到2,它就是一个视图,所以没有视图方法。我不想回去删除行,所以我倾向于重写它为[array[2] self],特别是当我必须再次更改第三个索引时。 - Kyle Howells
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)。这是完全有可能的。


1
“SELF”在NSPredicates中被记录为特殊常量,就像“nil”,“NULL”和其他一些常量一样。它可以映射到实际的“self”方法,但是根据文档,它似乎是特殊的。 - Wade Tregaskis

2

我不确定为什么最初加入了"self",但其中一个有用之处是保护对象的内部指针。苹果公司的官方建议是在完成对内部指针的使用后插入[foo self]调用;该方法调用在功能上没有任何作用,但确保编译器一直保留foo。


-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;
}

在我写这篇回复之前,它更有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接