• 对象模型


    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

  • 相关阅读:
    iOS 面试题汇总
    iOS管理文件和目录
    文件管理
    Cocoapods依赖管理
    IOS开发几何类方法 CGGeometry.h文件
    CGContext
    respondsToSelector的相关使用
    Java数组5作业(2015-8-27)
    Java错误1(2015-8-27)
    Java数组4(2015-8-27)
  • 原文地址:https://www.cnblogs.com/bigshow1949/p/6102363.html
Copyright © 2020-2023  润新知