簡體   English   中英

Objective-C中的選擇器是否只是向對象發送消息的另一種方式?

[英]Are selectors in Objective-C just another way to send a message to an object?

Objective-C中的選擇器是否只是向對象發送消息的另一種方式? 我真的不明白為什么或如何使用它們。

當您要定義回調機制時,通常使用選擇器。 Cocoa中選擇器最常見的用例是帶有控件,例如按鈕。 UIButton非常通用,因此不知道按下按鈕時會發生什么。 在使用一種方法之前,您需要告訴它按下按鈕時應運行哪種方法。 這樣做如下:

[myButton addTarget:self
             action:@selector(myButtonWasPressed)
   forControlEvents:UIControlEventTouchUpInside];

- (void)myButtonWasPressed {
    // Do something about it
}

然后,當按下按鈕時,該按鈕將調用我們傳遞給它的目標上的選擇器。 使用這種機制,您不需要每次希望按鈕調用自己的一些代碼時就將其歸類。 相反, UIButton本身具有一種通用機制,可用於分派到您選擇的任何代碼。 (好的,從技術上講,這是提供調度機制的超類UIControl 。)

它們不是向對象發送消息的另一種方法,而是唯一的方法。 例如,在[myView setValue:@"foo"]setValue:是選擇器。 (另一種不太方便的寫相同方法的方法是objc_msgSend(myView, @selector(setValue:), @"foo") 。)

正如Ian Henry所說,您可以在運行時而不是編譯時使用SEL值選擇一個選擇器。 這是可可粉中的一項基本技術。 用戶界面通常使用目標/動作綁定連接到控制器,其中目標是對象,而動作是選擇器。 通常,您可以在筆尖中進行設置,但是您也可以在代碼中進行設置:

[myButton setTarget:myController];
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton].

您可以將選擇器存儲為變量,並在以后或在其他上下文中調用它們。 例如,您可以告訴對象在特定時間或在不同線程上執行選擇器。 您還可以根據數據選擇要執行的選擇器,這就是接口構建器和核心數據如何工作的方式。

最基本的是,但是您可以在運行時更改消息。 例如:

SEL a = [selectorFactory getSelector];
[someOtherObject performSelector:a];

然后在selectorFactory.getSelector

if(foo == 1)
    return @selector(thisSelector);
else
    return @selector(thatSelector);

來自C#或其他類似語言,與使用NSNotification相比,您可以使用它輕松(輕松地)模擬事件。 例如,您可以創建一個具有兩個ivars的按鈕類,即targetselector ,並讓按鈕在單擊目標時在目標上執行選擇器(例如)。

但是,選擇器還有很多其他功能。 在這里閱讀有關它們的更多信息:

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocSelectors.html

-來自Apple Developer Library-

選擇器是用於選擇要為對象執行的方法的名稱,或者是唯一的標識符,用於在編譯源代碼時替換該名稱。 選擇器本身不會執行任何操作。 它僅標識一種方法。 使選擇器方法名稱不同於純字符串的唯一事情是編譯器確保選擇器是唯一的。 選擇器之所以有用,是因為它(與運行時結合使用)就像一個動態函數指針,對於給定的名稱,它自動指向適用於所使用的任何類的方法的實現。 假設您有一個用於方法運行的選擇器,以及Dog,Athlete和ComputerSimulation類(它們各自實現了方法運行)。 選擇器可以與每個類的實例一起使用,以調用其run方法,即使每個實現的實現可能有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM