【问题标题】:Syntax for invoking a method in Objective C?在 Objective C 中调用方法的语法?
【发布时间】:2012-06-17 04:14:40
【问题描述】:

我来自 Java 世界,所以对我来说都是 object.foo(),但在 Objective C 中,对象消息传递是调用方法的唯一方法吗?

[object foo];

【问题讨论】:

    标签: java iphone objective-c ios


    【解决方案1】:

    你可以使用KVC:

     [label setValue:@"Some text" forKey:@"text"];
    

    【讨论】:

      【解决方案2】:

      首先想到的是使用@property 和点符号。一个名为 'foo' 的 @property 类允许你这样做:

      anInstance.foo = @"bar";
      

      字面意思在编译时翻译成

      [anInstance setFoo:@"bar"];
      

      (类似于“getter”)

      其他的方式更高级,比如使用NSObject的performSelector:方法,或者其他系统比如NSInvocation等。再深入一点,还有在运行时调用方法的方法,用c函数(所有这些语法最终都沸腾了)无论如何都要调用c函数);但我敢肯定这不是你想要的。

      【讨论】:

      • 在使用[]而不是.时是否有性能考虑?
      • 实际上,您使用了短语“对象消息传递是调用方法的唯一方法吗?”,因此技术答案是“否”。消息传递转换为运行时函数调用,您也可以使用它们。事实上,您已经触及了运行时的核心“特性”之一,即消息与方法的动态绑定。在运行时为发送的每条消息查找“方法”(或更准确地说是实现)。看看这个:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
      • 程序实际运行时,它们实际上是相同的。我的意思是字面意思。
      • @RaffiM 以下是您关于性能注意事项的一个很好的答案:stackoverflow.com/questions/1249392/…>
      • 我所追求的是调用方法的所有语法方式。
      【解决方案3】:

      是的。您可以使用点语法来获取或设置 Objective C 属性。因此,例如在 UILabel *label 上设置文本可以通过 [label setText:@"some text"];label.text = @"some text"; 来完成

      【讨论】:

      • -> 怎么样,如 label->setText("some text"); ?
      • 点表示法非常简单,至少对于属性来说,括号是地狱;-)
      • @ctrahey 的链接很好。如前所述,foo->bar 访问由 foo 指向的 C 结构的 bar 成员。不涉及Objective-C,这也不是一种调用方法的方式。可以通过这种方式访问​​对象实例变量,因为 Objective-C 中的对象基本上只是结构,它们的 ivars 是结构的成员。
      【解决方案4】:

      看在迂腐的份上,何不去低级:

      objc_msgSend(object, sel_getUid("foo"), errVar);
      

      【讨论】:

      • 现在有两个了!看起来有些人需要重温他们的运行时函数!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2015-07-10
      • 2012-01-12
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多