Class (簡單說獲得它的類 )函數
當一個類被正確的編譯事後,在這個編譯成功的類裏面,存在一個變量用於保存這個類的信息。spa
咱們能夠經過一個普通的 字符串 取得 這個Class。翻譯
也能夠經過咱們生成的 對象 取得這個Class。orm
Class被成功取得以後,咱們能夠把這個Class看成一個已經定義好的類來使用它。對象
1.能夠Class來獲得 對象的 類,ci
2.也能夠在程序執行的階段動態的生成一個在編譯階段沒法肯定的一個對象。 開發
由於Class裏面保存了一個類的全部信息,(咱們也能夠取得一個類的超類)。關於Class類型,具體的使用格式以下:
字符串
1.經過向一個類或者對象發送class消息來得到這個類或者對象的Class變量。it
Class 變量名 = [類或者對象 class]; io
2.經過向一個類或者對象發送superclass消息來得到這個類或者對象的超類的Class變量。
Class 變量名 = [類或者對象 superclass];
3.經過調用NSClassFromString函數,而且把一個字符串做爲參數來取得Class變量。這個在咱們使用配置文件決定執行某個類的時候,NSClassFromString給咱們帶來了極大的方便。
Class 變量名 = NSClassFromString(@"字符串");
4.函數NSStringFromClass,經過一個Class類型做爲變量取得一個類的名字。
NSString *變量名 = NSStringFromClass(Class參數);
當咱們在程序裏面經過使用上面的第一,二或者第三行代碼成功的取得一個Class類型的變量,好比說咱們把這個變量名字命名爲myClass,那麼咱們在之後的代碼種能夠把myClass看成一個咱們已經定義好的類來使用,固然咱們能夠把這個變量做爲參數傳遞到其餘的方法當中讓其餘的方法動態的生成咱們須要的對象。
NSClassFromString是一個頗有用的東西,尤爲在進行iPhone toolchain的開發上。
正常來講,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是同樣的。可是,若是你的程序中並不存在MySpecialClass這個類,下面的寫法會出錯,而上面的寫法只是返回一個空對象而已。
所以,在某些狀況下,能夠使用NSClassFromString來進行你不肯定的類的初始化。
好比在iPhone中,NSTask可能就會出現這種狀況,因此在你須要使用NSTask時,最好使用:
[[NSClassFromString(@"NSTask") .....]]
而不要直接使用[NSTask ...]這種寫法。
NSClassFromString的好處是:
1 弱化鏈接,所以並不會把沒有的Framework也link到程序中。
2 不須要使用import,由於類是動態加載的,只要存在就能夠加載。所以若是你的toolchain中沒有某個類的頭文件定義,而你確信這個類是能夠用的,那麼也能夠用這種方法。
NSStringFromSelector
SEL sel=@selector(compare:);
NSString *functionName= NSStringFromSelector(sel);
SEL anotherSel=NSSelectorFromString(方法名字的字符串);
在編譯時設置變量爲SEL變量最有效的方法就是@selector()指令。然而,在某些狀況下,你可能須要在運行時轉換一個字符串爲一個selector。
第一行是直接在程序裏面寫上方法的名字,第2行是經過sel變量獲取方法的名字。第三行是寫上方法名字的字符串.
咱們獲得 SEL變量以後,能夠經過下面的調用來給一個對象發送消息:
[對象 performSelector:SEL變量 withObject:參數1 withObject:參數2];
這樣的機制增長了程序的靈活性,能夠經過給一個方法傳遞sel參數,讓這個方法動態的執行某一個方法,咱們也能夠經過配置文件制定須要執行的方法,程序讀取配置文件以後把方法的字符串翻譯成sel變量而後給相應的對象發送這個消息
從效率的角度上來講,執行的時候不是經過方法名字而是經過方法的ID來查找方法,因爲整數的查找比匹配字符串快得多,因此這樣能夠在某種程序上提升執行的效率