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-class的superclass指向父类的meta-class
基类的meta-class的superclass指向基类的class
instance调用对象方法的轨迹
isa找到class,方法不存在,就通过superclass找父类
class调用类方法的轨迹
isa找meta-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本质的主要内容,如果未能解决你的问题,请参考以下文章