NSSelectorFromString(@" methodName");创建一个对象?

时间:2014-06-05 19:26:06

标签: objective-c cocoa

到目前为止,我已经学会了在Obj-C中创建对象的这些方法:

[[FooClass alloc] init]  
[FooClass new]  
[NSNumber numberWithInt:1]  

现在我遇到了:

SEL aSelector = NSSelectorFromString(@"methodName");

那句法让我感到困惑 aSelector 是SEL类的一个实例,使 NSSelectorFromString 是一个不遵循Obj-C语法的工厂方法吗?

注意:根据Apple文档:
“编译的选择器是类型 SEL。”
“当您希望代码发送一个在运行时可能无法知道其名称的消息时,可以使用字符串中的选择器创建。”

3 个答案:

答案 0 :(得分:1)

SEL不是Objective-C类。它是私人struct的typedef名称:

/// An opaque type that represents a method selector.
typedef struct objc_selector *SEL;

选择器由运行时库本身创建和拥有; NSSelectorFromString()可能会导致创建选择器,但更有可能是从现有列表中检索

答案 1 :(得分:1)

NSSelectorFromString()是一个函数,而前三个例子是方法。这只是函数的语法。它是单独调用的,而不是任何特定的对象。

就选择者而言:

根据文件:

  

SEL

     

定义表示方法选择器的opaque类型。

     

typedef struct objc_selector * SEL;

     

讨论方法选择器用于表示方法的名称   在运行时。方法选择器是已注册的C字符串   (或“映射”)与Objective-C运行时。由...生成的选择器   当类是时,运行时会自动映射编译器   加载。

这是一个结构,而不是一个类。

答案 2 :(得分:0)

查看SEL结构

  

typedef struct objc_selector * SEL;

用于表示方法的名称。 objective-c中的SEL类型是指向struct objc_selector

的指针
  

NSSelectorFromString,

它从字符串返回SEL。

SEL Reference