2012-09-21 55 views
1

是這樣的:參數和選擇

[self showInWindow:window]; 

什麼得到這個代碼delay後叫:

[self performSelector:@selector(showInWindow:) 
      withObject:window 
      afterDelay:delay]; 

或我誤解的方法?

編輯:我遇到的問題是,該方法showInWindow的延遲之後被調用,但行爲像[self showInWindow:nil]。任何建議?

回答

2

是的,這就是所謂的。 (當然是延遲了。)

The documentation並沒有真正解釋「執行選擇器」的含義,但它意味着什麼正是你所懷疑的。

使用performSelector:withObject:類型的方法和直接發送消息之間有一個小的區別:只有當對象實際上是一個對象(即一個指向Objective C對象的指針id)時它們才起作用。但window顯然是一個對象。

(嚴格來說,這並不完全正確,如果你傳遞的尺寸與id相同或更小,它通常會起作用,在某些情況下它不會,在某些情況下它可以工作,但在某些情況下,它會起作用並且是合法的,但蘋果強烈建議不要這樣做,沒有任何情況下這是一個好主意 - 所以不要去學習具體的規則,只是假設它永遠不會起作用。但在NeXT時代,這往往是Objective C中的常見做法,因此您可能偶爾仍會在今天的其他人中看到它。)

有關performSelector:系列的更多信息,請參閱NSObject Protocol Reference和SO問題Using -performSelector: vs. just calling the method。 (有關具體有關afterDelay:變體的信息,請參閱文檔上面鏈接。)

從後來的編輯的問題:

我遇到的問題是,該方法showInWindow的延遲之後被調用但行爲像[self showInWindow:nil]。任何建議?

首先,它以什麼方式「表現得像」參數爲零?參數實際上是否爲零? (只需在showInWindow:實施中記錄它;如果您沒有覆蓋基本實施,只需添加一個覆蓋,記錄並調用基地。)

其次,如果它實際上爲零,那麼當時是零發送performSelector:withObject:afterDelay:?如果是這樣,當選擇器發送時顯然它仍然是零。此外,請確保window確實是id而不是其他類型。 (請注意,如果您有會員,房產,全球資產和/或當地人共用名稱window,可能會混淆您指的是哪一個。這是常見的問題來源。)

如果是實際上並不是零,但是當它到達時,有幾種方法可能發生,但它們都比這兩種情況更不可能,更難以調試,所以我們先排除它們。

+0

我用我的代碼的問題是,方法showInWindow:被調用,但它執行像窗口是零。 – Francesco

+1

我強調,它不僅是*不推薦*,它是非常明確** verboten **作爲'id'(或更具體)類型的參數傳遞非對象類型。 – bbum

+0

bburn:好點。實際上,仍然允許但不推薦在間接調用中使用非對象類型 - 但由於不允許在直接調用「performSelector:withObject:」時使用它們,因此這裏不重要。 – abarnert

0

是的,這就是它的作用......雖然請記住,它可能需要比執行延遲更長的時間。此方法在當前線程的運行循環中基本上設置了NSTimer,因此如果您的線程忙於執行繁重的工作並且運行循環比您的延遲返回時間更長,那麼您的方法將在稍後執行。