日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Object-C 类,对象,运行时,isa

發布時間:2023/12/9 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Object-C 类,对象,运行时,isa 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天記錄一下它的底層運作。
???????1: 類Class:
???????typedef struct objc_class * Class;
?????從Class的定義可以看出,它是一個 objc_class 結構類型的指針,objc_class又是什么呢?
???

struct objc_class { struct objc_class* isa; struct objc_class* super_class;??//root的為null const char* name; long version; long info; long instance_size; struct objc_ivar_list* ivars; struct objc_method_list** methodLists;??//方法列表 struct objc_cache* cache;?????//緩存最近使用的方法,以提高效率; struct objc_protocol_list* protocols; };
??????為什么Class的第一個成員也是Class呢,它的內存布局豈不是和底下的object一樣了?其實這就是類對象(class object)與實例對象(instance object)的區別了。
?????Object-C對類對象與實例對象中的 isa 所指向的類結構作了不同的命名:類對象中的 isa 指向類結構被稱作 metaclass,metaclass 存儲類的static類成員變量與static類成員方法(+開頭的方法);實例對象中的 isa 指向類結構稱作 class(普通的),class 結構存儲類的普通成員變量與普通成員方法(-開頭的方法).
??
?????2:對象id:
typedef struct objc_object { Class isa; } *id; ????可以發現, id可以用來表示任意一個對象,它是一個 objc_object 結構類型的指針,其第一個成員是一個 objc_class 結構類型的指針。
????我們的根類NSObject也同樣是只有一個Class成員:
???@interface?NSObject?<NSObject>?{
???????Class???????isa;
????}
????這個isa到底是什么呢?官方介紹是這樣的:
????Every object is connected to the run-time system through its?isa?instance variable, inherited from the NSObject class.?isa?identifies the object's class; it points to a structure that's compiled from the class definition. Through?isa, an object can find whatever information it needs at run timesuch as its place in the inheritance hierarchy, the size and structure of its instance variables, and the location of the method implementations it can perform in response to messages.
????可見,一個對象(Object)的isa指向了這個對象的類(Class),而這個對象的類(Class)的isa指向了metaclass。這樣我們就可以找到靜態方法和變量了。


???????3:?運行時:?
?????Objective-C的運行時是動態的,它能讓你在運行時為類添加方法或者去除方法以及使用反射。這在其它語言是不多見的。
???????

類的實例對象的 isa 指向它的類;類的 isa 指向該類的 metaclass; 類的 super_class 指向其父類,如果該類為根類則值為 NULL; metaclass 的 isa 指向根 metaclass,如果該 metaclass 是根 metaclass 則指向自身; metaclass 的 super_class 指向父 metaclass,如果該 metaclass 是根 metaclass 則指向該 metaclass 對應的類;
?????Object-C 為每個類的定義生成兩個 objc_class ,一個普通的 class,另一個即 metaclass。我們可以在運行期創建這兩個 objc_class 數據結構,然后使用 objc_addClass將 class 注冊到運行時系統中,以此實現動態地創建一個新的類。

轉載于:https://www.cnblogs.com/ChrisYu/p/4649979.html

總結

以上是生活随笔為你收集整理的Object-C 类,对象,运行时,isa的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。