iOS 底層探究:OC對象

這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰編程

在OC面向對象編程中,咱們天天都面對着建立對象,操做對象,那對象到底是什麼?實例化的對象和類的本質又是什麼?markdown

OC的類在C++的底層呈現

打開#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語言又提供了一種數據結構,稱爲「位域」或「位段」。 所謂「位域」是把一個字節中的二進位劃分爲幾個不一樣的區域,並說明每一個區域的位數。每一個域有一個域名,容許在程序中按域名進行操做。這樣就能夠把幾個不一樣對象用同一個字節的二進制位域來表示。

總結

對象本質:

  • 對象的本質是結構體。
  • 類也是對象,本質一樣是結構體。
  • 萬物皆對象,萬物皆有isa。
  • isa本質是結構體指針,佔8字節。
  • 全部對象的底層實現,本質上都來自於objc_object結構體。

位域:

  • 一種數據結構。
  • 可使數據單元節省存儲空間。

聯合體:

  • 成員之間內存共用,各變量是「互斥」的。
  • 可節省內存空間。
  • 聯合體的大小,爲最大成員變量的大小。
  • 通常會配合位域一塊兒使用。
  • 缺點:包容性較差
相關文章
相關標籤/搜索