底层-OC对象的本质

2020-01-09  本文已影响0人  Stago

Objective-C的本质

结构体

  • xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件

  • 如果需要链接其他框架,使用-framework参数。比如-framework UIKit

实时查看内存数据

2个容易混淆的函数

#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj);

常用LLDB指令

  • memory read/数量格式字节数 内存地址
  • x/数量格式字节数 内存地址

x/3xw 0x10010

x是16进制,f是浮点,d是10进制

b:byte 1字节,h:half word 2字节
w:word 4字节,g:giant word 8字节

  • memory write 内存地址 数值
    memory write 0x0000010 10

OC对象的分类

  • instance对象(实例对象)
  • class对象(类对象)
  • meta-class对象(元类对象)
  • isa指针
  • 其他成员变量

class

  • isa指针
  • superclass指针
  • 类的属性信息(@property)、类的对象方法信息(instance method)
  • 类的协议信息(protocol)、类的成员变量信息(ivar)
  • ......

meta-class

  • isa指针
  • superclass指针
  • 类的类方法信息(class method)
  • ......

注意

查看Class是否为meta-class

isa指针

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

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

class对象的superclass指针

meta-class对象的superclass指针

isa、superclass总结

如果没有父类,superclass指针为nil

基类的meta-class的superclass指向基类的class

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

isa找meta-class,方法不存在,就通过superclass找父类

isa指针

objc4源码下载

窥探struct objc_class的结构

上一篇 下一篇

猜你喜欢

热点阅读