致电时,性能是否有任何显着差异
[someObject performSelector:@selector(testMethod:) withObject:anotherObject];
vs
[someObject testMethod:anotherObject];
答案 0 :(得分:8)
第一个引起对objc_msgSend()的额外调用,这在第二种情况下是不必要的。
性能差异不大可能远远不重要,除非你尽可能快地调用所述方法和你没有在{{1}做任何重要的工作}。
即。除非你衡量一个实际的性能问题,否则不要担心。
答案 1 :(得分:2)
有趣的是,执行延迟为0的选择器会导致在app的下一个运行循环的顶部调用该方法。您可以使用它来延迟频繁发生的某些事件(在UI优化中使用很多,比如在UIScrollView中重新加载的图像)
答案 2 :(得分:0)
没有任何我所知道的性能影响,如果有任何影响并不重要。
答案 3 :(得分:0)
以上两种方法都有很多不同之处。我试图获得两个按钮的动画来自右侧并停在中央,但第二个按钮是0.3秒延迟。现在重点来到这里。我正在为两个按钮使用一种动画方法。现在我希望当我单击完成按钮时,两个按钮都应该向左和向左按钮。这很好,直到阅读。
现在,当我为Finish按钮编写方法时,单击。我首先执行按钮动画然后进入按钮,但当我使用上面的第二种方法即[someObject testMethod:anotherObject];
时,发生的事情是我无法看到外出动画并直接进入按钮动画被展示了。
这里实际上是使用第一种方法,即[someObject performSelector:@selector(testMethod:) withObject:anotherObject withDelay:delay];
我发现的原因是当我单击Finish按钮时,动画在不同的线程中运行,而其他代码在不同的线程中运行,因此外出操作在另一个线程中执行,并且在另一个线程中执行。所以没有显示第一个帖子。
使用具有延迟时间总动画的第一种方法。我实现了我的目标。所以这两种方法都有其自身的意义。
答案 4 :(得分:0)
在将数据传递给prepareForSegue中的另一个视图控制器时,我遇到了一个重要的区别。
使用:
[viewController performSelector:@selector(aMethod :) withObject:anObject];
aMethod被称为AFTER viewDidLoad和目标viewController的viewWillAppear。
使用:
[viewController aMethod:anObject];
aMethod在目标viewController的viewDidLoad和viewWillAppear之前调用。
因此,如果您发送的数据对于目标viewController的设置很重要,请使用第二种方法。
答案 5 :(得分:-1)
根据我的经验,有两点不同:
第一个可以添加afterDelay:(CGFloat)秒,这是我使用第一个的唯一情况。
[someObject performSelector:@selector(testMethod:) withObject:anotherObject afterDelay:1.0];
第二个,您需要在someObject.h中定义它。否则,您将收到编译警告。
答案 6 :(得分:-2)
答案是他们完全相同。
Mike Ash有两篇非常好的文章,他解释了objc_msgSend()
:
Tom Dalling的另一个人正在解释执行选择器正在调用objc_msgSend()
。