Objective-C具有相當多的動態特性,基本的,也是經常被提到和用到的有
- 動態類型(Dynamic typing)
- 動態綁定(Dynamic binding)
- 動態加載(Dynamic loading)
動態類型:程序直到執行時才能確定所屬的類。
id 數據類型
id 通用的對象類型,可以存儲任意類型的對象,id后面沒有號,它本身就是個指針
類似於void ,但只可以指向對象類型
靜態類型與動態類型
- 編譯期檢查與運行時檢查
- 靜態類型在編譯期就能檢查出錯誤
- 靜態類型聲明代碼可讀性好
- 動態類型只有在運行時才能發現錯誤
動態綁定:程序直到執行時才能確定實際要調用的方法。
動態綁定所做的,即是在實例所屬類確定后,將某些屬性和相應的方法綁定到實例上。
BOOL類型
bool是C語言的布爾類型,有true和false,BOOL是Objective C 語言的布爾類型,有YES和NO,因為OC可以跟C混編,所以bool和BOOL可以同時出現在代碼中
BOOL深入解析:
typedef signed char BOOL;
BOOL類型有兩個值YES,NO。YES=1,NO=0。
說明:objective-c 中的BOOL實際上是一種對帶符號的字符類型(signed char)的類型定義(typedef),它使用8位的存儲空間。通過#define指令把YES定義為1,NO定義為0。
Class類:表示一個類名,class被創建后,我們可以把class來當成對象的類。 Class cla1 = [類名 class] Class cla2 = [對象 class] Class cla3 = NSClassFromString(@"類名");
SEL 類成員方法的指針 可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言的中函數指針,只不過C語言中,可以把函數名直接賦給一個函數指針,而Object-C的類不能直接應用函數指針,這樣只能做一個@selector語法來取. 它的結果是一個SEL類型。這個類型本質是類方法的編號(函數地址) 1>類里面的方法都是被轉換成SEL變量進行存儲的。 2>放類聲明一個對象,對象調用方法的時候,系統會被這個方法轉換成SEL,然后拿這個SEL到類方法中去匹配。 3>我們可以自己手動把方法轉換成SEL,然后用這個SEL去查找方法(performSelector)。
-isMemberOfClass: 判斷是否是這個類的實例 -isKindOfClass: 判斷是否是這個類或者這個類的子類的實例 -respondsToSelector: 判讀實例是否有這樣方法 +instancesRespondToSelector: 判斷類是否有這個方法。此方法是類方法。
動態加載:根據需求加載所需要的資源
這點很容易理解,對於iOS開發來說,基本就是根據不同的機型做適配。最經典的例子就是在Retina設備上加載@2x的圖片,而在老一些的普通屏設備上加載原圖。隨着Retina iPad的推出,和之后可能的Retina Mac的出現,這個特性相信會被越來越多地使用。
贈品
多態的出現時為了讓不同的類能使用同名的方法。這個讓程序的可讀性大大提高,也降低了編程難度。
動態類型與動態綁定是為了解決隨多態的便利而引起的弊端,有了動態類型與動態綁定,不用去考慮輸出中的方法是哪個類型的方法,會自動判定。
而id類型的出現就是為了更好的承接動態類型與動態方法出來的返回值。