OC对象的本质

2018-08-04  本文已影响10人  我真的不是张亮

1、OC对象的本质

OC对象就是一个结构体,结构体中包含了一个isa指针,系统给对象分配得内存空间最小是16个字节(mallocz_size((__bridge const void *)objc),获得objc指针所指向内存的大小,导入malloc/malloc.h),但是实际只用了8个字节(class_getInstanceSize[NSObject class],这个是runtime中的要导入<objc/runtime.h>,获得NSObject类的实例对象的成员变量所占空间大小),查看objc的源码中copyWithZone方法: 

 // Allocate and initialize

    size = cls->alignedInstanceSize() + extraBytes;

    // CF requires all objects be at least 16 bytes.

    if (size < 16) size = 16;

2、查看苹果开源代码

https://opensource.apple.com/tarballs/

3、架构

    模拟器(i386) 32bit(armv7) 64bit(arm64)

4、OC代码怎么在机器上运行起来

OC -> C/C++ -> 汇编语言 -> 机器语言

5、查看并修改地址

查看地址可以直接打印对象,在Debuge -> Debuge WorkFlow -> ViewMemory 中输入地址 或者直接打印 Memory  read XX接上地址  输出是比这个地址符号大的地址符号, 但是只有前8位是有值,因为objc对象实际只用了8个字节(memory read 0x6080000062c0

0x6080000062c0:

88 2e 05 0c 01 00 00 00 00 00 00 00 00 00 00 00  ................)  如果你需要改变0x6080000062c0 的值  memory write 0x6080000062c0 10   那上面的88 就会变成10 了

6、OC代码转换成C++代码

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc XXX.m -o XXX.cpp

7、继承关系的两个类,子类中包含父类的结构体指针,一个isa指针占用8个字节 如果你的子类或者父类中还有其他成员变量,那么你的实例对象的大小就是其余成员变量+父类成员变量所占的字节+8 

8、结构体内存大小必须是最大成员变量的倍数 比如一个结构体里面有一个isa指针是8个字节 有个int类型是4个字节  那这个结构体内存大小一定是8的倍数(内存对齐),这个只是结构体的内存大小,但是操作系统也有内存对齐的概念,操作系统给对象分配的内存一定是16的倍数,比如结构体成员变量占用内存大小为20 那结构体的大小就是24  但是对象在系统中的大小就是32

上一篇下一篇

猜你喜欢

热点阅读