ios - performSelector 或直接

标签 ios objective-c cocoa performselector

我知道这两者有点相似,但两者之间肯定有任何内在差异,

[anObject performSelector:@selector(thisMethod:) withObject:passedObject];

相当于:

[anObject thisMethod:passedObject];

请告诉我在编译、内存等方面有什么区别

最佳答案

performSelector 系列方法用于特殊情况,Obj-C 中的绝大多数方法调用应该是直接的。一些区别:

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

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

只有两个参数: performSelector 系列仅包含传递 0、1 或 2 个参数的变体,因此您不能使用它们来调用采用 3 个或更多参数的方法.

您可能认为以上大部分内容都是负面的,那么有什么好处呢?

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

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

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

关于ios - performSelector 或直接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15238223/

相关文章:

ios - UITableView 单元格计数不足

ios - coreData 插入到许多关系

ios - 只有一个节标题

iphone - NSDate 日期返回的时间比应有的少 2 小时

objective-c - 如何获取 NSString 的前三个字符?

ios- "swapping"UIViews 可能吗?

ios - 如何在 Xcode 中显示照片库图像?

ios - 以周为单位对 NSDate 进行分组并按从最新到最旧的顺序排列

objective-c - 放慢播放速度?

macos - mojave 不提示用户访问联系人