【问题标题】:what does do method class in objective c目标c中的方法类做什么
【发布时间】:2013-12-06 17:24:35
【问题描述】:

这可能是一个愚蠢的问题。我正在通过研究代码来学习 Objective C (iOS),我遇到了表达式

[InstanceName class];

它有什么作用?

我试图搜索类方法,但它只是弹出类方法和实例方法等之间的区别。我猜它可能会给出某种类对象,但我不知道该语句的目的是什么。

原始代码是使用 FB SDK 的 Sample Facebook App(美味)....

【问题讨论】:

  • 在尝试破译代码之前阅读一些文档可能更容易......只是说。
  • @CaptJak 除非您深入研究运行时和链接器文档,否则文档在这种情况下并没有真正的帮助。
  • @bbum:是的。但我也指的是:“我正在通过研究代码来学习目标 C(iOS)”。我不是因为他问这个问题而抨击他。这个问题很好。
  • @CaptJak 我肯定会浏览文档。这是教程的示例应用程序,此行在描述中被悄悄地忽略了。我只是感兴趣,仅此而已,无需踢开敞开的门。
  • 怎么回事???现在我心情不好!我并不是说您做错了什么,只是提出了另一个未提及的选项。对不起,如果我冒犯了。我明白了,你被否决了......不是我!

标签: ios objective-c


【解决方案1】:

如果您将这样的内容视为独立表达式......

[InstanceName class];

...那么代码很可能会强制在所述类上执行+initialize 方法。第一次在类上调用任何方法时,+initialize 方法将在运行时之前被调用。所以,看看InstanceName 看看它是否有+initialize 方法。

请注意,强制+initialize 以这种方式执行是糟糕设计的明确标志。 +initialize 不应该像这样被强制,也不应该有执行顺序依赖。


这行代码的存在还有一个合理的额外原因。通过硬引用引用InstanceName,它将强制链接器链接库中的所有符号。 (如果你没有硬引用库中的至少一个符号——a .a——一些链接器会简单地将库从链接单元中完全删除。)

【讨论】:

    【解决方案2】:

    它获取对象的类。

    例如,如果 InstanceName 是类 Foo 的实例

    [InstanceName class]; 将在 Class 类型的变量中返回 Foo

    您可以使用class_getClassName 从此类中获取NSString 来记录它。

    【讨论】:

    • 运行时 API 永远不会返回 NSStringclass是类方法,不是NSObject协议中的实例方法,但确实存在实例方法。
    【解决方案3】:

    class 是继承自NSObject 的方法。它使您可以获取类对象的实例,该实例表示调用该方法的实例的类。

    可用于检查当前对象的元数据。例如,您可以使用class 方法来确定给定对象是否属于特定类:

    if ([sender isKindOfClass:[UIButton class]]) {
        ...
    }
    

    【讨论】:

    • 我知道在您提供的上下文中,您将结果传递给某个方法。我无法将其视为 [Foo class] 的单行语句;
    • @lombausch 哦,我没有意识到这个表达式是独立的。
    【解决方案4】:

    它返回对象的类。假设您创建了一组UIView 子类,并且您只想对属于某个类的人执行某些操作。您可以遍历数组并检查每个对象的类:

    for (id view in myViews) {
      if ([view isKindOfClass:[MyUIViewSubclass class]]) {
         // Do something
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 2021-08-30
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多