首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >performSelector或直接

performSelector或直接
EN

Stack Overflow用户
提问于 2013-03-06 11:05:00
回答 5查看 3.2K关注 0票数 2

我知道这两者有点相似,但两者之间肯定有什么内在的区别,

代码语言:javascript
复制
[anObject performSelector:@selector(thisMethod:) withObject:passedObject];

等同于:

代码语言:javascript
复制
[anObject thisMethod:passedObject];

请告诉我在编译、内存等方面有什么不同。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-06 11:48:41

performSelector的方法系列是针对特殊情况的,在Obj-C中的绝大多数方法调用应该是直接的。以下是一些差异:

间接:当使用performSelector调用一个方法时,有两个方法调用:performSelector和目标方法。

参数是对象:当通过performSelector调用时,所有参数都必须作为对象传递,例如,如果调用一个接受double的方法,那么在传递给performSelector之前,该值必须包装为NSNumberperformSelector方法在调用目标方法之前展开非对象参数。在直接调用中,不需要包装或解包。

只有两个参数:performSelector家族只包括传递0、1或2个参数的变体,所以你不能用它们来调用一个接受3个或更多参数的方法。

你可能会认为上面的大多数都是负面的,那么有什么好处呢?

动态选择器:performSelector家族允许您调用一个直到运行时才知道的方法,只需要知道它的类型(这样您就可以传递正确的参数并获得正确的结果);换句话说,选择器参数可以是SEL类型的表达式。当您希望将一个方法作为参数传递给另一个方法并调用它时,可以使用此方法。然而,如果你正在使用动态选择器编译是非常重要的,并且通常会产生编译器警告,因为在不知道选择器的情况下,ARC无法知道参数的所有权属性。

延迟执行:performSelector家族包括在延迟后调用该方法的方法。

通常使用直接方法调用,只有当它不能满足您的需求时,您才需要考虑performSelector家族(或其更深奥的近亲)。

票数 7
EN

Stack Overflow用户

发布于 2013-03-06 11:56:19

与直接调用该方法相比,performSelector:withObject:会稍微慢一些。间接性也意味着编译器无法进行正确的类型检查。在启用ARC的情况下,您还会遇到编译器会抱怨的问题,因为不可能确切地确定内存管理策略可能是什么。

一般而言,这种间接--通常称为反射,但更准确地称为元编程--应该被避免,因为它将编译时可检测到的故障转移到运行时故障。

只有在编译时无法确定被调用的选择器的名称--方法的名称时,才需要这种动态性。它不应该用于协议中的@optional方法,也不应该在委托期间使用(在这两种情况下,respondsToSelector: +直接方法调用都是一种更好的模式)。

票数 3
EN

Stack Overflow用户

发布于 2013-03-06 11:15:59

performSelector:方法允许您发送直到运行时才确定的消息。有关更多信息,请阅读this.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15238223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档