OC基础--Objective-C本质

Posted 日常工作点点滴滴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC基础--Objective-C本质相关的知识,希望对你有一定的参考价值。

Objective-C的本质:

底层实现都是C\C++代码,OC的对象、类主要是基于C\C++的结构体类型实现的


创建一个实例对象所需的内存大小:

至少需要的内存

class_getInstanceSize([NSObject class]);

实际分配

malloc_size((__bridge const void *)obj);


OC对象的分类:主要分成三种

instance对象

    实例对象是通过类alloc出来的对象,每次条用alloc都会产生新的instance对象

    instance对象在内存中存储的信息包括:
        isa指针

        其他程序变量

class对象

    每个类在内存有且只有一个class对象

    class对象在内存中存储的信息包括:

        isa指针

        superclass指针

        类的属性信息

        类的对象方法

        类的成员变量

        类的协议

meta-class对象

    元类,同样只有一个

    内存结构与类对象一样,用途不同

        isa指针

        superclass指针

        类的类方法


isa指针:

  • instance的isa指向class

    当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用

  • class的isa指向meta-class

    当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用


superclass指针:

  • class对象的superclass指针

    当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用

  • meta-class的superclass指针

    当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用


isa、superclass总结:

  • instance的isa指向class

  • class的isa指向meta-class

  • meta-class的isa指向基类的meta-class

  • class的superclass指向父类的class 如果没有父类,superclass指针为nil

  • meta-classsuperclass指向父类的meta-class

  • 基类的meta-classsuperclass指向基类的class

  • instance调用对象方法的轨迹

  • isa找到class,方法不存在,就通过superclass找父类

  • class调用类方法的轨迹

  • isameta-class,方法不存在,就通过superclass找父类


struct object_class的结构:


相关面试题:

1、一个NSObject对象占用多少内存?

    系统分配了16个字节给NSObject对象(通过malloc_size函数获取)

    但NSObject对象内部只使用了8个字节的空间(通过class_getInstanceSize函数获取)


2、对象的isa指针指向哪里?

    instance对象的isa指针指向class对象

    class对象的isa指针指向meta-class对象

    meta-class对象的isa指针指向基类的meta-class对象


3、OC的类信息存放在哪里?

    对象方法、属性、成员变量、协议存放在class对象中

    类方法存储在元类对象中

    成员变量的具体值存储在instance对象中

以上是关于OC基础--Objective-C本质的主要内容,如果未能解决你的问题,请参考以下文章

[OC学习笔记]对象的本质探索

OC对象的本质

iOS-Objective-C的本质

Objective-C学习1

,继承

Programming with Objective-C