究竟什么是@selector?

nod*_*nja 11 cocoa cocoa-touch objective-c

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

Dav*_*ong 35

@selector()是一个编译器指令,用于将括号内的任何内容转换为SEL.A SEL是表示方法名称的类型,但不是方法实现.(为此你需要一个不同的类型,可能是一个IMP或一个Method)在引擎盖下,a SEL被实现为char*,虽然依赖于这种行为不是一个好主意.如果你想检查SEL你拥有的东西,最好的办法就是把它变成NSString*这样:

NSLog(@"the current method is: %@", NSStringFromSelector(_cmd));
Run Code Online (Sandbox Code Playgroud)

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

Objective-C编程语言教程有关于这个问题的更多信息.

  • `SEL`实际上不再是C字符串了; 它指向libobjc中定义的opaque类型.第一个成员是一个C字符串,用于兼容性目的,但你不应该依赖它; 正确的代码使用`sel_getName`来实际访问C-string成员,或使用`NSStringFromSelector`来从中创建NSString. (9认同)
  • @Catfish_Man 如果传入有效的选择器,为什么 NSStringFromSelector() 会崩溃?它是一个已发布的 API,没有理由消失 (2认同)