有一些函数可以作为参数@选择器(MethodName)。我使用NSLog来找出@selector是什么,它返回一个整数。它看起来像一个PID,但当我运行ps ax时,找不到该PID。这个整数代表什么,为什么我们必须一直使用@selector,而不是只传递方法名?
发布于 2010-08-14 14:54:27
@selector()是一个编译器指令,用于将括号内的内容转换为SEL。SEL是一种类型,用于指示方法名称,而不是方法实现。(为此,您需要一个不同的类型,可能是IMP或Method)本质上,SEL是作为char*实现的,尽管依赖该行为并不是一个好主意。如果您想要检查您拥有的SEL,最好的方法是将其转换为如下所示的NSString*:
NSLog(@"the current method is: %@", NSStringFromSelector(_cmd));(假设您知道_cmd是每个方法调用的隐藏参数之一,并且是与当前方法相对应的SEL )
Objective-C Programming Language Guide有更多关于这个主题的信息。
发布于 2010-08-14 21:00:02
我认为看一下Objective-C实现可能会对理解有所帮助:
选择器是一个整数值。但是它的类型不同于普通的C整数值,所以你不能赋值。
选择器名称,如"methodName“,是唯一表示该整数名称的字符串。
其他语言和系统将这个唯一的程序称为从宽字符串到整数的原子(Windows)或夸克(GTK)映射。
Objective-C将一个类的所有函数都保存在一个哈希表中。哈希表关键字是一个整数。Objective-C运行时库在每次方法调用时查找哈希表。如果没有唯一的整数,执行这种关键查找的速度会慢得多。
选择器不再是指向结构的不透明指针。在MacOSX 10.6中,实现Objective-C方法调用的obj_send运行时函数在开始时对选择器使用算术运算,以确定它是否是保留、释放、自动释放消息,并在这种特殊情况下执行某些操作。例如,如果您使用垃圾收集器,只需返回即可。
https://stackoverflow.com/questions/3482344
复制相似问题