【问题标题】:What is the @selector directive for? Why not simply use the name of the method?@selector 指令有什么用?为什么不简单地使用方法的名称?
【发布时间】:2012-05-25 16:03:22
【问题描述】:

我已经阅读了很多文章来理解为什么必须使用@selector() 来引用方法,但我认为我并不满意。例如,当我们为按钮指定操作时,我们必须编写:

[btn addTarget:self action:@selector(myMethod)];

为什么不简单:

[btn addTarget:self action:myMethod];

请解释需要和原因,以及没有它会发生什么。

【问题讨论】:

  • 这是因为在 Objective-c 中我们有消息传递而不是方法调用...
  • 完全有效的问题,到目前为止,没有一个答案涉及真正的原因(尽管他们都给出了为什么首先使用选择器的充分理由。

标签: objective-c selector


【解决方案1】:

为了理解@selector关键字,我阅读了很多文章 但我还是不太明白它的目的。我只想问 为什么我们有@selector。

这一切都与解析 C 语言有关。

就其本身而言,在[obj performSelector:someRandomSelector]' 这样的表达式中,编译器将someRandomSelector 位视为“扩展someRandomSelector 的任何内容——评估表达式、处理#defines、放置符号以供以后链接等。 . -- 任何扩展产生的最好是 SEL。

因此,如果您要编写[obj performSelector:action]',编译器将无法知道action 作为包含潜在易失选择器的变量和actionobj 上方法的实际名称之间的区别.

从历史上看,Objective-C 最初是作为 C 预处理器的直接扩展实现的。所有各种以@... 为前缀的添加都使实现变得更加容易,因为基本上任何以@ 为前缀的东西都是Objective-Cism。

【讨论】:

    【解决方案2】:

    这是语言设计的问题。您需要说“这是一个选择器”,这就是他们用来分隔源文件中描述您正在谈论的选择器及其周围代码的文本的语法。这需要某种引号或括号。 @selector(...) 只是他们使用的语法。

    如果您有一个包含: 的选择器,例如名为thingWithX:y:z:,该怎么办?你不能有[btn addTarget:self action:thingWithX:y:z:],因为冒号会混淆编译器。您必须拥有[btn addTarget:self action:@selector(thingWithX:y:z:)],这样它才能将btn 的选择器action: 和它引用的选择器`thingWithX:y:z: 分开。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 实际上,在 Objective-C 中,选择器确实在运行时持续存在,并且选择器在内部本质上是一个唯一的 C 字符串。
      • 好的,我删除了我笨拙的解释,我只是链接到文档。
      【解决方案4】:

      如果 myMethod 是 SELECTOR 的实例,您的示例可以工作

      [btn addTarget:self action:myMethod];
      

      对于字符串,您可以使用

      [btn addTarget:self action:NSSelectorFromString(@"myMethod")];
      

      这里解释https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

      这是一个通用 actionLinker 函数的示例How to programmatically setup a CallBacks for a UIButton?

      - (void)setRunButton:(UIButton *)objectName mySelector:(NSString *)action myControlEvent:(UIControlEvents)controlEvent {
      
         [objectName addTarget:self action:NSSelectorFromString(action) forControlEvents:controlEvent];
      
      }
      

      如果你想用自己的例子和 myMethod 作为选择器的实例,下面的代码更适用

      - (void)setRunButton:(UIButton *)objectName mySelector:(SEL)action myControlEvent:(UIControlEvents)controlEvent {
      
         [objectName addTarget:self action:action forControlEvents:controlEvent];
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多