我知道这两者有点相似,但两者之间肯定有什么内在的区别,
[anObject performSelector:@selector(thisMethod:) withObject:passedObject];等同于:
[anObject thisMethod:passedObject];请告诉我在编译、内存等方面有什么不同。
发布于 2013-03-06 11:48:41
performSelector的方法系列是针对特殊情况的,在Obj-C中的绝大多数方法调用应该是直接的。以下是一些差异:
间接:当使用performSelector调用一个方法时,有两个方法调用:performSelector和目标方法。
参数是对象:当通过performSelector调用时,所有参数都必须作为对象传递,例如,如果调用一个接受double的方法,那么在传递给performSelector之前,该值必须包装为NSNumber。performSelector方法在调用目标方法之前展开非对象参数。在直接调用中,不需要包装或解包。
只有两个参数:performSelector家族只包括传递0、1或2个参数的变体,所以你不能用它们来调用一个接受3个或更多参数的方法。
你可能会认为上面的大多数都是负面的,那么有什么好处呢?
动态选择器:performSelector家族允许您调用一个直到运行时才知道的方法,只需要知道它的类型(这样您就可以传递正确的参数并获得正确的结果);换句话说,选择器参数可以是SEL类型的表达式。当您希望将一个方法作为参数传递给另一个方法并调用它时,可以使用此方法。然而,如果你正在使用动态选择器编译,是非常重要的,并且通常会产生编译器警告,因为在不知道选择器的情况下,ARC无法知道参数的所有权属性。
延迟执行:performSelector家族包括在延迟后调用该方法的方法。
通常使用直接方法调用,只有当它不能满足您的需求时,您才需要考虑performSelector家族(或其更深奥的近亲)。
发布于 2013-03-06 11:56:19
与直接调用该方法相比,performSelector:withObject:会稍微慢一些。间接性也意味着编译器无法进行正确的类型检查。在启用ARC的情况下,您还会遇到编译器会抱怨的问题,因为不可能确切地确定内存管理策略可能是什么。
一般而言,这种间接--通常称为反射,但更准确地称为元编程--应该被避免,因为它将编译时可检测到的故障转移到运行时故障。
只有在编译时无法确定被调用的选择器的名称--方法的名称时,才需要这种动态性。它不应该用于协议中的@optional方法,也不应该在委托期间使用(在这两种情况下,respondsToSelector: +直接方法调用都是一种更好的模式)。
发布于 2013-03-06 11:15:59
performSelector:方法允许您发送直到运行时才确定的消息。有关更多信息,请阅读this.
https://stackoverflow.com/questions/15238223
复制相似问题