![](/img/trans.png)
[英]What's the difference between the method signature and the selector in Objective-C?
[英]What's the difference between a method and a selector?
Objective-C 中的方法、選擇器和消息之間有什么區別?
這是一個很好的問題。
Selector - Selector 是方法的名稱。 您對這些選擇器非常熟悉: alloc
、 init
、 release
、 dictionaryWithObjectsAndKeys:
、 setObject:forKey:
等。注意冒號是選擇器的一部分; 這就是我們如何識別此方法需要參數的方式。 另外(雖然它非常罕見),你可以有這樣的選擇器: doFoo:::
。 這是一個接受三個參數的方法,您可以像[someObject doFoo:arg1 :arg2 :arg3]
一樣調用它。 不需要在選擇器組件的每個部分之前都有字母。 正如我所說,這是極其罕見的,你不會發現它在 Cocoa 框架中使用。 您可以直接在 Cocoa 中使用選擇器。 它們的類型為SEL
: SEL aSelector = @selector(doSomething:)
或SEL aSelector = NSSelectorFromString(@"doSomething:");
消息- 消息是一個選擇器和你用它發送的參數。 如果我說[dictionary setObject:obj forKey:key]
,那么“消息”是選擇器setObject:forKey:
加上參數obj
和key
。 消息可以封裝在一個NSInvocation
對象中以供以后調用。 消息被發送到接收者。 (即“接收”消息的對象)。
方法- 方法是選擇器和實現(以及伴隨的元數據)的組合。 “實現”是實際的代碼塊; 它是一個函數指針(一個IMP
)。 可以使用Method
結構在內部檢索實際方法(可從運行時檢索)。
您沒有要求的其他一些相關事項:
方法簽名- 方法簽名表示方法返回和接受的數據類型。 它們可以在運行時通過NSMethodSignature
和(在某些情況下)原始char*
。
實現- 方法的實際可執行代碼。 它在運行時的類型是一個IMP
,它實際上只是一個函數指針。 iOS 4.3 包含將塊轉換為IMP
的新功能。 這真的很酷。
要實現的有趣的事情之一是方法的名稱(選擇器)與方法的實現(IMP)不同。 這意味着你可以交換它們,如果你覺得大膽的話。 您還可以在運行時添加和刪除方法,因為您所做的只是編輯哈希表中的條目:鍵是選擇器,值是方法的IMP
。 這允許你做一些非常瘋狂和迷幻的事情。 這不適合膽小的人。 :)
方法是在要求對象或類執行某些操作時運行的實現。 它在其包含類的范圍內,因此在通過其他類引用時是不同的。 選擇器是表示方法名稱的標識符。 它與任何特定的類或方法無關,可以用來描述任何類的方法,無論是類還是實例方法。
簡單地說,選擇器就像字典中的一個鍵。 它可以告訴您某人在談論什么方法,但前提是您還擁有字典本身(類或對象)。 當您使用選擇器作為鍵從字典中請求值時,您會得到該方法。
該站點對所有相關術語進行了很好的概述: http : //www.otierney.net/objective-c.html
查看鏈接,但我會給出一個快速總結:
方法本質上就像您在最喜歡的編程語言中習慣的函數方法。
一條消息(來自文章)“一條消息可以動態轉發到另一個對象。在 Objective-C 中調用對象上的消息並不意味着該對象實現了該消息,只是它知道如何通過某種方式響應它直接實現它或將消息轉發給知道如何實現的對象。”
選擇器可能意味着兩件事。 它可以指方法的名稱,或者“指的是在編譯源代碼時替換名稱的唯一標識符。編譯后的選擇器屬於 SEL 類型”。 (來自: http : //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.