对象模型

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/

2)http://www.jianshu.com/p/32c533ef546f

原文地址:https://www.cnblogs.com/bigshow1949/p/6102363.html