performSelector与直接呼叫性能

时间:2011-07-28 01:47:57

标签: iphone objective-c ios cocoa

致电时,性能是否有任何显着差异

[someObject performSelector:@selector(testMethod:) withObject:anotherObject];

vs

[someObject testMethod:anotherObject];

7 个答案:

答案 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)

根据我的经验,有两点不同:

  1. 第一个可以添加afterDelay:(CGFloat)秒,这是我使用第一个的唯一情况。

       [someObject performSelector:@selector(testMethod:) withObject:anotherObject  afterDelay:1.0];
    
  2. 第二个,您需要在someObject.h中定义它。否则,您将收到编译警告。

答案 6 :(得分:-2)

答案是他们完全相同

Mike Ash有两篇非常好的文章,他解释了objc_msgSend()

Tom Dalling的另一个人正在解释执行选择器正在调用objc_msgSend()