1.什么是isa指針
概念:
Every object has an isa instance variable that identifies the object's class. The runtime uses this pointer to determine the actual class of the object when it needs to.
每個對象都有一個標識對象類的isa實例變量. 運行時使用此指針來確定對象需要的實際類.(isa 可以理解為這是個什么類).
在xcode中用快捷鍵Shift+Cmd+O 打開文件objc.h 能看到類的定義:

從圖可以看出三點:
- id類型是一個objc_object結構體的指針
- objc_object結構體包含一個Class類型的變量isa
- Class是objc_class結構體的指針.
事實上OC中的runtime中, 類是用objc_class結構體表示的, 對象是用objc_object結構體表示的. 這也就解釋了為什么id類型可以指向OC中任意對象類型了.
objc_class結構體的結構:
struct objc_class {
Class isa //所屬類的指針
Class super_class//指向父類的指針
const char *name //類名
long version // 版本
long info //供運行期使用的一些位標識。
long instance_size //實例大小
struct objc_ivar_list *ivars //成員變量數組
struct objc_method_list **methodLists //方法列表
struct objc_cache *cache//指向最近使用的方法.用于方法調用的優(yōu)化
struct objc_protocol_list *protocols//協(xié)議的數組
}
看到第一個變量有點崩潰, 但說明了萬物皆對象, 類也是對象, 類是meteClass(元類)的實例.
總結一下:
- 實例對象在運行時蓓表示成objc_object類型結構體, 結構體內部有isa指針指向objc_class結構體.
- objc_class內部保存了類的變量和方法列表以及其他信息, 并且還有一個isa指針.這個isa指針指向meteClass(元類), 元類里保存了這個類的類方法列表.
-
元類里也有isa指針, 這個isa指針指向根源類, 根源類的isa指針指向自己.
第二個參數superClass的實現:
