【问题标题】:What is the purpose of the -self method in NSObject-conformant classes?NSObject-conformant 类中的 -self 方法的目的是什么?
【发布时间】:2012-12-15 20:14:42
【问题描述】:

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

【问题讨论】:

  • 问题是“为什么会有人想要...”或“目的是什么...”,而不是“为什么会在那里?”
  • 这似乎是一个有效的问题。为什么投反对票?
  • 它非常开放……没有真正直接的答案。就像@H2CO3 所问的那样,为什么会有人想要它?
  • @H2CO3 和@John - 你有没有实际的理由使用self 方法?我也很好奇这什么时候有用。为什么我需要打电话给[self self][someObject self]?在这个问题之前,我什至没有注意到存在这种方法。
  • 我在 cycript 中使用它纯粹是因为懒惰。视图 = [数组 [1] 视图];然后我将索引放到索引 2,它是一个视图,所以没有视图方法。而不是必须返回并删除行,我倾向于将其重写为 [array[2] self],尤其是当我必须再次更改第 3 个索引时。

标签: objective-c nsobject foundation


【解决方案1】:

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

【讨论】:

  • "SELF" 在 NSPredicates 中被记录为一个特殊的常量,如 "nil"、"NULL" 和其他一些常量。它可以映射到实际的“self”方法,但对我来说,文档暗示它很特别。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2013-01-12
      • 2017-08-28
      • 2018-04-29
      • 2010-09-07
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多