究竟什么是@selector?

时间:2010-08-14 06:50:08

标签: objective-c cocoa cocoa-touch

有些函数将@selector(methodName)作为参数。我使用NSLog来查找@selector是什么,并返回一个整数。它看起来像一个PID,但是当我运行ps ax时,无法找到PID。该整数代表什么,为什么我们必须一直使用@selector而不是只传递方法名?

2 个答案:

答案 0 :(得分:35)

@selector()是一个编译器指令,用于将括号内的任何内容转换为SELSEL是指示方法名称的类型,但方法实现。 (为此你需要一个不同的类型,可能是IMPMethod)。* SEL实现为char*,尽管依赖这种行为不是一个好主意。如果你想检查你拥有的SEL,最好的办法就是把它变成这样的NSString*

NSLog(@"the current method is: %@", NSStringFromSelector(_cmd));

(假设您知道_cmd是每个方法调用的隐藏参数之一,并且是与当前方法对应的SEL

Objective-C Programming Language Guide提供了有关此主题的更多信息。

答案 1 :(得分:-2)

我认为查看Objective-C实现可能有助于理解:

选择器是整数值。但它的类型与普通的C整数值不同,因此您无法分配它们。

“methodName”之类的选择器名称是唯一表示此整数名称的字符串。

其他语言和系统将此唯一程序宽字符串称为整数映射原子(Windows)或夸克(GTK)。

Objective-C将类的所有函数保留在哈希表中。散列表键是整数。 Objective-C运行时库在每次方法调用时查找哈希表。如果没有唯一的整数,那么执行此关键查找会慢得多。

选择器不再是指向结构的不透明指针。使用MacOSX 10.6,实现Objective-C方法调用的obj_send运行时函数在开头使用选择器上的算术运算来查明它是否是保留,释放,自动释放消息,并在这种特殊情况下执行某些操作。例如,如果您使用垃圾收集器,只需返回。