Selector簡短的定義:Selector就是用字串表示某個物件的某個method。
用更術語的說法會是:Selector就是Objective-C的virtual table中指向實際執行
function point的一個C字串。
那Selector有什麼用途呢:因為method可以用字串表示,因此,某個method就會變成可以用來傳遞的參數。
檢查某個funtion是否存在:respondsToSelector
在Objective-C中同樣也有try...catch語法、但並不鼓勵在Objective-C語言中使用。原因與Objective-C的記憶體管理機制有關,如果大量使用try..Catch,會導致Memory Leak
Objective-C本身並不算有Garbage Collection的語言,雖然在Mac OS X 10.5嘗試在Objective-C上使做GC,但是成果實在不甚理想,如果大量使用容易造成Memory Leak,因此在推出iOS之後也不敢將這套機制用在行動裝置上,而是在iOS5時放棄在runtime管理記憶體,而是推出ARC(Automatic Reference Counter)在compile time時決定什麼時候應該釋放記憶體
呼叫performSelector:需要注意的地方
1.我們在呼叫performSelector:的時候需要注意幾點:
對super呼叫performSelector:
前面雖然提到,對一個物件直接呼叫某個method,或是透過performSelector:呼叫,意義是一樣的,但如果是對super呼叫,卻有不一樣的結果。如果是:
[super doSomething];
代表的是super的doSomething實作。但如果是:
[super performSelector:@selector(doSomething)];
呼叫的是super的performSelector:,最後結果仍然等同於[self doSomething]。
2.如果是用Refactor工具修改名字的話Xcode並不會把用performSelector:呼叫要執行這個method的名字替換掉只會出現簡短的訊息。
一個selector只會指向一個實作,因此Objective-C不會有C++、Java、C#等語言當中的overloading。所謂overloading,就是可以容許有多個名稱相同,但是參數型別不同的function或method存在,在呼叫的時候,如果傳入了指定型別的參數,就會呼叫到屬於該參數型別的那一組function或mehtod。在Objective-C當中,同一個名稱的method,就只會只有一套實作,如果有多個名稱相同的method,就會以最後在runtime載入的那一組,代替之前的實作。
但Objective-C這樣做又有另外一項優點:我們的App不需要連結特定版本的runtime與libraries,就算libraries中export出來的function換了位置,只要selector不變,還是可以找到應該要執行的C function所以舊的App在新版本的作業系統上執行時,新版本作業系統,並不需要保留舊版的Libraries,而避免了C++等語言中所謂DLL Hell問題。
沒有留言:
張貼留言