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
网友评论