isa 指针
在object-c 中每个对象都有一个isa指针指向它的类。
类中包含信息如下:
1.类的描述信息
2.对象的成员变量列表
3.对象的方法列表
4.对象接受消息的列表
类也是个对象,是另一个类的实例,这个类叫做元类(metaClass)。类的isa指针指向(metaClass)
1.类方法都保存在元类中
2.元类存在继承关系,元类顶层叫做根元类(rootClass),根元类的isa指针指向自己,形成闭环, 即NSObject中的isa指针指向自己。
3.类方法被调用时,元类先查找本身是否有该类方法,没有则去查找父元类,直到继承链顶层。
如图(图片地址):
1.对象在内存中是一个结构体,无法动态改变大小,无法动态增加成员变量。
结构体中的 对象方法列表 methodLists 是一个指针,它可以动态增加方法,
可以想下Category动态扩展方法的原理了。
注:
可以通过objc_setAssociatedObject、objc_getAssociatedObject 来动态添加成员变量,但是没有真正改变对象的内存结构。
具体例子可以看我Demo,目录:07-零散知识点--->05-运行时--->03跟05
动态创建对象
1. import runtime.h
2. 使用 objc_allocateClassPair 方法创建新类
3. 使用 class_addMethod 方法添加新方法
4. 使用 objc_registerClassPair 注册新类
5. 使用 object_getClass 获得isa指针指向的对象
动态替换对象
1.class_replaceMethod 替换类方法,如果没有原方法,会使用替换的方法
2.method_exchangeImplementations 交互2个方法的实现
3.method_setImplementation 设置方法的实现
总结
对象的 成员变量、方法列表、消息列表 都保存在它的类中,通过isa指针来指向类的方法 都保证在它的metaClass中,通过isa指针来指向。
参考:
1)http://blog.devtang.com/2013/10/15/objective-c-object-model/