Cocoa @selector用法的解释

时间:2009-02-12 20:46:20

标签: 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;
}

6 个答案:

答案 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];