Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa@selector用法说明_Objective C - Fatal编程技术网

Objective c Cocoa@selector用法说明

Objective c Cocoa@selector用法说明,objective-c,Objective C,我刚接触Cocoa/Cocoa Touch,正在阅读一本开发书籍。我遇到过使用@selector()运算符的情况。我对@selector()操作符应该如何以及何时使用有点茫然。有人能提供一个简短而甜蜜的解释和例子,说明为什么使用它以及它给开发者带来了什么好处吗 顺便说一句,下面是从苹果iPhone开发网站上获取的使用@selector()的示例代码 选择器操作符提供了一种引用对象提供的方法的方法,有点类似于C中的函数指针。它非常有用,因为它允许您对对象调用方法的过程进行解耦。例如,一段代码可以提

我刚接触Cocoa/Cocoa Touch,正在阅读一本开发书籍。我遇到过使用@selector()运算符的情况。我对@selector()操作符应该如何以及何时使用有点茫然。有人能提供一个简短而甜蜜的解释和例子,说明为什么使用它以及它给开发者带来了什么好处吗

顺便说一句,下面是从苹果iPhone开发网站上获取的使用@selector()的示例代码


选择器操作符提供了一种引用对象提供的方法的方法,有点类似于C中的函数指针。它非常有用,因为它允许您对对象调用方法的过程进行解耦。例如,一段代码可以提供一个方法,另一段代码可以将该方法应用于给定的一组对象

示例:

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

[object respondsToSelector:@selector(methodName)]
存储一个方法,以便以后调用对象

SEL method = @selector(methodName);
[object performSelector:method];
在不同的线程上调用方法(对于GUI工作很有用)


每次需要将方法名作为参数传递给另一个方法、函数或变量值时,都会使用
@selector()
。直接传递名称在objective-C中不起作用。

一个参考:


除了上面所说的,您还可以将@selector包装在NSInvocation中,以便以后使用。您可以在NSInvocation创建后很长一段时间内将参数设置为NSInvocation,并在需要触发消息时激活它。这给了你很大的力量

为了介绍这个概念,斯科特·史蒂文森(Scott Stevenson)写了一篇很棒的文章,题目是。

一个实用的例子是用目标动作识别菜单项的方法

简化示例:

- (BOOL)validateMenuItem:(NSMenuItem *)item {
    if ([item action] == @selector(selectFiles:) && otherCondition) {
        return YES;
    } else {
        return NO;
    }
}

您可以使用选择器调用对象上的方法,这为Cocoa中目标操作设计模式的实现提供了基础

[myObject performSelector:@selector(runMYmethod:) withObject:parameters];
相当于:

[myObject runMYmethod:parameters];

感谢您的解释-如果您知道对象支持该方法,您能否举例说明为什么要使用它而不是以常规方式调用方法?@lupefiasco:[object performSelectorInBackground:@selector(methodName)]将导致对该方法的异步调用。另一个用例是,如果您将选择器的名称作为字符串,则可以在运行时执行类似于[object performSelector:NSSelectorFromString(某物)…]的操作,该操作可能与
[myObject performSelector:@selector(runMYmethod:) withObject:parameters];
[myObject runMYmethod:parameters];