這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰編程
在OC面向對象編程中,咱們天天都面對着建立對象,操做對象,那對象到底是什麼?實例化的對象和類的本質又是什麼?markdown
打開#import<objc/objc.h>
文件數據結構
/// An opaque type that represents an Objective-C class.
//一個不透明類型用於表示Objective-C類
typedef struct objc_class *Class;
/// Represents an instance of a class.
//表示類的實例
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
複製代碼
能夠看出,OC中的類(Class
)編譯後在C++中是以 struct objc_class
呈現的,咱們衆所周知的NSObject
類編譯後在C++中是一個struct objc_object
,裏面只有一個成員變量,即Class類型的變量isa
。 在這裏,咱們也明白了爲何OC中的大部分對象了能夠用id接收,由於id自己就是一個objc_object類型的結構體指針
。 那麼objc_object和objc_class是什麼關係呢?其實咱們自定義(繼承於NSObject)的類,編譯成C++對應的就是objc_class。 疑問:爲何isa的類型是Class?其根本緣由是因爲isa對外反饋的是類信息,爲了讓開發人員更加清晰明確,須要在isa返回時作了一個類型強制轉換
。post
結構體是指把不一樣的數據組合成一個總體,其變量是共存的,變量無論是否使用,都會分配內存。spa
缺點:全部屬性都分配內存,比較浪費內存。假設有4個int成員,一共分配了16字節的內存,可是在使用時,你只使用了4個字節,剩餘的12字節就是屬於內存的浪費。指針
優勢:存儲容量較大,包容性強,且成員之間不會相互影響code
聯合體也是由不一樣的數據類型組成,但其變量時互斥的,全部成語攻佔一段內存。並且共用體採用了內存覆蓋技術,同一時刻只能保存一個成員的值,若是對新的成員賦值,就會將原來成員的值覆蓋掉。orm
缺點:包容性弱。對象
優勢:全部成員共用一段內存,使內存的使用更爲精細靈活,同時也節省了內存空間。繼承
有些信息在存儲時,並不須要佔用一個完整的字節,而只需佔幾個或一個二進制位。例如在存放一個開關量時,只有0和1兩種狀態,用1位二進制位便可。爲了節省存儲空間,並使處理簡單,C語言又提供了一種數據結構,稱爲「位域」或「位段」。 所謂「位域」是把一個字節中的二進位劃分爲幾個不一樣的區域,並說明每一個區域的位數。每一個域有一個域名,容許在程序中按域名進行操做。這樣就能夠把幾個不一樣對象用同一個字節的二進制位域來表示。
對象本質:
位域:
聯合體: