有些函数将@selector(methodName)作为参数。我使用NSLog来查找@selector是什么,并返回一个整数。它看起来像一个PID,但是当我运行ps ax时,无法找到PID。该整数代表什么,为什么我们必须一直使用@selector而不是只传递方法名?
答案 0 :(得分:35)
@selector()
是一个编译器指令,用于将括号内的任何内容转换为SEL
。 SEL
是指示方法名称的类型,但不方法实现。 (为此你需要一个不同的类型,可能是IMP
或Method
)。* 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运行时函数在开头使用选择器上的算术运算来查明它是否是保留,释放,自动释放消息,并在这种特殊情况下执行某些操作。例如,如果您使用垃圾收集器,只需返回。