Cocoa @selector用法的解释

msh*_*rir 24 objective-c

我是Cocoa/Cocoa Touch的新手,并且正在编写一本开发手册.我遇到过使用@selector()运算符的情况.关于如何以及何时应该使用@selector()运算符,我有点迷失.有人可以提供一个简短而甜蜜的解释,说明为什么使用它以及它给开发人员带来了什么好处?

顺便说一下,这里是从Apple的iPhone开发站点获取的示例代码,它使用@selector()

if ([elementName isEqualToString:@"entry"])
{

    parsedEarthquakesCounter++;

    // An entry in the RSS feed represents an earthquake, so create an instance of it.
    self.currentEarthquakeObject = [[Earthquake alloc] init];
    // Add the new Earthquake object to the application's array of earthquakes.
    [(id)[[UIApplication sharedApplication] delegate]
            performSelectorOnMainThread:@selector(addToEarthquakeList:)
            withObject:self.currentEarthquakeObject waitUntilDone:YES];
    return;
}
Run Code Online (Sandbox Code Playgroud)

And*_*ant 40

选择器运算符提供了一种引用对象提供的方法的方法,有点类似于C中的函数指针.它很有用,因为它允许您解除对象上调用方法的过程.例如,一段代码可以提供方法,另一段代码可以将该方法应用于给定的一组对象.

例子:

测试一个对象是否实现某种方法:

[object respondsToSelector:@selector(methodName)]
Run Code Online (Sandbox Code Playgroud)

存储方法以便以后调用对象;

SEL method = @selector(methodName);
[object performSelector:method];
Run Code Online (Sandbox Code Playgroud)

在不同的线程上调用方法(对GUI工作很有用).

[object performSelectorOnMainThread:@selector(methodName)]
Run Code Online (Sandbox Code Playgroud)

  • 另一个用例是如果您将选择器的名称作为字符串,那么您可以在运行时执行类似[object performSelector:NSSelectorFromString(something)...]的操作. (10认同)
  • @lupefiasco:[object performSelectorInBackground:@selector(methodName)]将导致对该方法的异步调用. (9认同)
  • 感谢您的解释 - 您能举例说明为什么要使用它而不是以传统方式调用方法,假设您知道对象支持该方法吗? (3认同)