Object-C 类,对象,运行时,isa
生活随笔
收集整理的這篇文章主要介紹了
Object-C 类,对象,运行时,isa
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天記錄一下它的底層運(yùn)作。
???????1: 類Class:
???????typedef struct objc_class * Class;
?????從Class的定義可以看出,它是一個(gè) objc_class 結(jié)構(gòu)類型的指針,objc_class又是什么呢?
???
??????為什么Class的第一個(gè)成員也是Class呢,它的內(nèi)存布局豈不是和底下的object一樣了?其實(shí)這就是類對象(class object)與實(shí)例對象(instance object)的區(qū)別了。
?????Object-C對類對象與實(shí)例對象中的 isa 所指向的類結(jié)構(gòu)作了不同的命名:類對象中的 isa 指向類結(jié)構(gòu)被稱作 metaclass,metaclass 存儲類的static類成員變量與static類成員方法(+開頭的方法);實(shí)例對象中的 isa 指向類結(jié)構(gòu)稱作 class(普通的),class 結(jié)構(gòu)存儲類的普通成員變量與普通成員方法(-開頭的方法).
??
?????2:對象id:
typedef struct objc_object { Class isa; } *id; ????可以發(fā)現(xiàn), id可以用來表示任意一個(gè)對象,它是一個(gè) objc_object 結(jié)構(gòu)類型的指針,其第一個(gè)成員是一個(gè) objc_class 結(jié)構(gòu)類型的指針。
????我們的根類NSObject也同樣是只有一個(gè)Class成員:
???@interface?NSObject?<NSObject>?{
???????Class???????isa;
????}
????這個(gè)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.
????可見,一個(gè)對象(Object)的isa指向了這個(gè)對象的類(Class),而這個(gè)對象的類(Class)的isa指向了metaclass。這樣我們就可以找到靜態(tài)方法和變量了。
???????3:?運(yùn)行時(shí):?
?????Objective-C的運(yùn)行時(shí)是動態(tài)的,它能讓你在運(yùn)行時(shí)為類添加方法或者去除方法以及使用反射。這在其它語言是不多見的。
???????
?????Object-C 為每個(gè)類的定義生成兩個(gè) objc_class ,一個(gè)普通的 class,另一個(gè)即 metaclass。我們可以在運(yùn)行期創(chuàng)建這兩個(gè) objc_class 數(shù)據(jù)結(jié)構(gòu),然后使用 objc_addClass將 class 注冊到運(yùn)行時(shí)系統(tǒng)中,以此實(shí)現(xiàn)動態(tài)地創(chuàng)建一個(gè)新的類。
轉(zhuǎn)載于:https://www.cnblogs.com/ChrisYu/p/4649979.html
總結(jié)
以上是生活随笔為你收集整理的Object-C 类,对象,运行时,isa的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 0714M
- 下一篇: ExtJs 4.x Ajax简单封装