Objective-C 語言特點/特性


Objective-C中

1、所有的類都必須繼承自NSObject。

2、所有對象都是指針的形式。

3、用self代替this。

4、使用id代替void*。

5、使用nil表示NULL,

6、只支持單繼承,不允許多重繼承。

7、使用YES/NO表示TRUE/FALSE

8、使用#import代替#include,

8、用消息表示類的方法,並采用[aInstance method:argv]調用形式。

9、支持反射機制,

10、支持Dynamic Typing(動態類型), Dynamic Binding(動態綁定)和Dynamic Loading(動態加載)。

11、不支持命名空間機制。

動態特性

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++中的純虛類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM