我知道这两者有点相似,但两者之间肯定有任何内在差异,
[anObject performSelector:@selector(thisMethod:) withObject:passedObject];
相当于:
[anObject thisMethod:passedObject];
请告诉我在编译、内存等方面有什么区别
最佳答案
performSelector
系列方法用于特殊情况,Obj-C 中的绝大多数方法调用应该是直接的。一些区别:
间接:当使用performSelector
调用一个方法时,您有两个方法调用; performSelector
和目标方法。
参数是对象:当通过 performSelector
调用时,所有参数都必须作为对象传递,例如如果调用采用double
的方法,则该值在传递给performSelector
之前必须包装为NSNumber
。 performSelector
方法在调用目标方法之前解包非对象参数。在直接调用中,不需要包装或解包。
只有两个参数: performSelector
系列仅包含传递 0、1 或 2 个参数的变体,因此您不能使用它们来调用采用 3 个或更多参数的方法.
您可能认为以上大部分内容都是负面的,那么有什么好处呢?
动态选择器: performSelector
系列允许您调用一个直到运行时才知道的方法,只需要知道它的类型 (这样您就可以传递正确的参数并获得正确的结果);换句话说,选择器参数可以是 SEL
类型的表达式。当您希望将一个方法作为参数传递给另一个方法并调用它时,可以使用它。 但是如果您使用动态选择器使用 ARC 进行编译是非常重要的并且通常会产生编译器警告,因为不知道选择器 ARC 无法知道参数的所有权属性。
延迟执行:performSelector
系列包括在延迟后调用方法的方法。
通常使用直接方法调用,只有当它不能满足您的需求时,您才需要考虑 performSelector
系列(或其更深奥的同类)。
关于ios - performSelector 或直接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15238223/