Objective-C中c++
一、全部的類都必須繼承自NSObject。數組
二、全部對象都是指針的形式。ide
三、用self代替this。函數
四、使用id代替void*。this
五、使用nil表示NULL,atom
六、只支持單繼承,不容許多重繼承。spa
七、使用YES/NO表示TRUE/FALSE指針
八、使用#import代替#include,code
八、用消息表示類的方法,並採用[aInstance method:argv]調用形式。orm
九、支持反射機制,
十、支持Dynamic Typing(動態類型), Dynamic Binding(動態綁定)和Dynamic Loading(動態加載)。
十一、不支持命名空間機制。
動態特性
OC作爲一門面向對象語言,天然具備面向對象的語言特性,如封裝、繼承、多態。他具備靜態語言的特性(如C++),又有動態語言的效率(動態綁定、動態加載等)。OC的動態特性表現爲了三個方面:動態類型、動態綁定、動態加載。之因此叫作動態,是由於必須到運行時(run time)纔會作一些事情。
(1)動態類型
動態類型,說簡單點就是id類型。動態類型是跟靜態類型相對的。像內置的明確的基本類型都屬於靜態類型(int、NSString等)。靜態類型是強類型,而動態類型屬於弱類型,靜態類型在編譯的時候就能被識別出來。因此,若程序發生了類型不對應,編譯器就會發出警告。而動態類型就編譯器編譯的時候是不能被識別的,要等到運行時(run time),即程序運行的時候纔會根據語境來識別。因此這裏面就有兩個概念要分清:編譯時跟運行時。
(2)動態綁定
動態綁定(dynamic binding)貌似比較難記憶,但事實上很簡單,只需記住關鍵詞@selector/SEL便可。先來看看「函數」,對於其餘一些靜態語言,好比c++,通常在編譯的時候就已經將將要調用的函數的函數簽名都告訴編譯器了。靜態的,不能改變。而在OC中,實際上是沒有函數的概念的,咱們叫「消息機制」,所謂的函數調用就是給對象發送一條消息。這時,動態綁定的特性就來了。OC能夠先跳過編譯,到運行的時候才動態地添加函數調用,在運行時才決定要調用什麼方法,須要傳什麼參數進去。這就是動態綁定,要實現他就必須用SEL變量綁定一個方法。最終造成的這個SEL變量就表明一個方法的引用。這裏要注意一點:SEL並非C裏面的函數指針,雖然很像,但真心不是函數指針。SEL變量只是一個整數,他是該方法的ID。之前的函數調用,是根據函數名,也就是字符串去查找函數體。但如今,咱們是根據一個ID整數來查找方法,整數的查找字天然要比字符串的查找快得多!因此,動態綁定的特定不只方便,並且效率更高。
(3)動態加載
讓程序在運行時添加代碼模塊以及其餘資源。用戶能夠根據須要加載一些可執行代碼和資源,而不是在啓動時就加載全部組件。可執行代碼中能夠含有和程序運行時整合的新類。
Nullability
從版本的 llvm 6.1 (Xcode 6.3) 就已經支持。這個簡版的 Optional ,沒有 Swift 中 ? 和 ! 語法糖的支持
例如:
@property (nonatomic, strong, nonnull) Sark *sark; @property (nonatomic, copy, readonly, nullable) NSArray *friends;
@property (nonatomic, strong, null_resettable) UIView *view; + (nullable NSString *)friendWithName:(nonnull NSString *)name;
Lightweight Generics
Lightweight Generics 輕量級泛型,輕量是由於這是個純編譯器的語法支持(llvm 7.0),和 Nullability 同樣,沒有藉助任何 objc runtime 的升級,也就是說,這個新語法在 Xcode 7 上可使用且徹底向下兼容(更低的 iOS 版本)
平時也得注意 協變性和逆變性
__covariant - 協變性,子類型能夠強轉到父類型(里氏替換原則)
__contravariant - 逆變性,父類型能夠強轉到子類型(WTF?)
__kindof
__kindof 這修飾符仍是很實用的,解決了一個長期以來的小痛點,拿原來的 UITableView 的這個方法來講:
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
Objective-C中的命名前綴說明:
NS-:NextStep CF-:Core Foundation CA-:Core Animation CG-:Core Graphics UI-:User Interface
Objective-C中沒有類的靜態變量,只有全局變量
Objective-C中的數組NSArray能夠保存不一樣類型的數據。
Objective-C也支持run-time時的類類型檢查
用於判斷該對象是否屬於某個類或者它的子類(以下:)
- (BOOL) isKindOfClass: classObj
用於判斷該對象是否屬於某個類(這裏不包括子類)(以下:)
- (BOOL) isMemberOfClass: classObj
- (BOOL) respondsToSelector: selector
用於判斷該對象是否能響應某個消息。這裏,咱們能夠將@selector後面帶的參數理解爲C++中的函數指針。
注意:
1)不要忘了@
2)@selector後面用的是(),而不是[]。
+ (BOOL) instancesRespondToSelector: selector
用於判斷該類是否能響應某個消息。這是一個靜態函數。
-(id) performSelector: selector :調用對象的selector方法。
conformsToProtocol 相似於respondsToSelector ,用於動態檢查某個對象是否遵照某個協議。
Category:能夠爲一個已經存在的類添加一些新的功能,只能添加新的方法,不能添加新的數據成員,Category 的名字必須是惟一的
Protocol:至關於C++中的純虛類