performSelector或直接

Ile*_*ruz 2 cocoa objective-c ios performselector

我知道这两者有点类似,但两者之间必须有任何内部差异,

[anObject performSelector:@selector(thisMethod:) withObject:passedObject];
Run Code Online (Sandbox Code Playgroud)

相当于:

[anObject thisMethod:passedObject];
Run Code Online (Sandbox Code Playgroud)

请告诉我在编译,记忆等方面有什么不同.

CRD*_*CRD 7

performSelector方法的家人都在特殊情况下,绝大多数的OBJ-C方法调用的应该是直接的.一些差异:

间接:当使用performSelector调用方法时,您有两个方法调用; performSelector和目标方法的那个.

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

只有两个论据:performSelector系列只包括通过0,1或2个参数变量,所以你不能用它们来调用这需要3个或多个参数的方法.

您可能会将上述大部分内容视为否定因素,那么有什么好处呢?

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

延迟执行:performSelector系列包括在延迟后调用该方法的方法.

通常使用直接方法调用,只有当它不能满足您的要求时才需要考虑performSelector家庭(或者更为深奥的堂兄弟).