我是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;
}
答案 0 :(得分:40)
选择器操作符提供了一种引用对象提供的方法的方法,有点类似于C中的函数指针。它很有用,因为它允许您解除对象上调用方法的过程。例如,一段代码可以提供方法,另一段代码可以将该方法应用于给定的一组对象。
示例:
测试一个对象是否实现某种方法:
[object respondsToSelector:@selector(methodName)]
存储方法以便以后调用对象;
SEL method = @selector(methodName);
[object performSelector:method];
在不同的线程上调用方法(对GUI工作很有用)。
[object performSelectorOnMainThread:@selector(methodName)]
答案 1 :(得分:4)
除了已经说过的内容之外,您还可以将@selector包装在NSInvocation中以供以后使用。您可以在创建后很长一段时间内将参数设置为NSInvocation,并在需要触发消息时激活它。这给你很大的力量。
对于这个概念的介绍,斯科特史蒂文森有一篇很棒的帖子,名为"Dynamic Objective-C with NSInvocation"。
答案 2 :(得分:2)
@selector()
。直接传递名称在Objective-C中不起作用。
答案 3 :(得分:2)
答案 4 :(得分:2)
一个实际的例子是validateMenuItem方法,其中菜单项用它们的目标动作来识别。
简化示例:
- (BOOL)validateMenuItem:(NSMenuItem *)item {
if ([item action] == @selector(selectFiles:) && otherCondition) {
return YES;
} else {
return NO;
}
}
答案 5 :(得分:0)
您可以使用选择器来调用对象上的方法 - 这为在Cocoa中实现目标操作设计模式提供了基础。
[myObject performSelector:@selector(runMYmethod:) withObject:parameters];
相当于:
[myObject runMYmethod:parameters];