2011-07-28 80 views
8

是否有任何性能上的差異顯著當你打電話performSelector VS直接調用性能

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

VS

[someObject testMethod:anotherObject]; 

+0

當prepareForSegue將數據傳遞給另一個視圖控制器時,我遇到了一個重要的區別。 使用: [viewController performSelector:@selector(aMethod :) withObject:anObject]; aMethod稱爲目標viewController的AFTER viewDidLoad和viewWillAppear。 使用: [viewController aMethod:anObject]; aMethod被稱爲BEFORE viewDidLoad和viewWillAppear的目標viewController。 因此,如果您發送的數據對設置目標viewController很重要,請使用第二種方法。 –

回答

7

第一個會導致額外調用objc_msgSend(),這在第二種情況下不是必需的。

的性能差異是不可能遠程關係,除非你以最快的速度調用該方法,你可能可以在上千次和許多10S你沒有做任何顯著工作testMethod:

I.e.除非您測量實際的性能問題,否則不要擔心。

0

沒有沒有,我知道的任何性能損失,如果有任何它不顯著。

-1

對於我的經驗,有兩點不同:

  1. 第一個可以添加afterDelay:(CGFloat的)秒,這是我用第一個唯一的案例。

    [someObject performSelector:@selector(testMethod:) withObject:anotherObject afterDelay:1.0]; 
    
  2. 第二個,你需要在someObject.h來定義它。否則,您將收到編譯警告。

+1

'performSelector:withObject:'和'performSelector:withObject:afterDelay:'是兩種完全不同的方法。至於(2),情況並非如此;有許多方法可以避免編譯器錯誤。 – bbum

+0

錯了。定義它是完全沒有必要的。 –

2

有趣的事實,執行與0的延遲的選擇會導致在在應用程序的下一個運行循環的頂部被調用的方法。你可以使用它來延遲經常發生的某些事件(在UI的優化中使用很多,例如在UIScrollView中重新加載的圖像)

+0

沒有真正回答這個問題,但絕對是一個有趣的事實。我建議將此添加爲對OP問題的評論。 – bbum

0

上面兩種方法都有很大的區別....我試圖得到的兩個按鈕,從右邊傳來的動畫,並在中心,但第二個按鈕是用0.3秒的延遲來停止。現在主要的點來這裏......我用了兩個2個按鈕一個動畫方法。現在我想,當我點擊完成按鈕,然後這兩個按鈕應該去到左,再新的按鈕來......這是罰款,直到閱讀...

現在,當我寫的方法完成按鈕點擊...我在表演外出按鈕的動畫,然後再在未來的按鈕....但是當我使用上述第二種方法即[someObject testMethod:anotherObject];後來才知​​道是發生了什麼不能夠看到走出去動畫和按鈕的動畫直接來了顯示...

這裏其實出自即[someObject performSelector:@selector(testMethod:) withObject:anotherObject withDelay:delay];

的原因,我發現使用第一種方法是,當我點擊完成按鈕動畫運行在不同的線程和其它代碼在不同的線程中運行,因此外出動作,而另一線程執行的,並且在另一線程中進行未來..所以第一線程被未示出..

使用第一種方法具有延遲時間之後全部動畫...我實現了我的目標.. 所以這兩種方法都有其自己的意義... njoy編程...

0

傳遞數據時,在prepareForSegue另一個視圖控制器我遇到的一個重要區別。

使用:

[的viewController performSelector:@selector(:) amethod方法withObject:anObject];

aMethod稱爲目標viewController的AFTER viewDidLoad和viewWillAppear。

使用:

[amethod方法的viewController:anObject];

aMethod被稱爲BEFORE viewDidLoad和viewWillAppear的目標viewController。

因此,如果您發送的數據對設置目標viewController很重要,請使用第二種方法。