美文网首页
OC对象的本质

OC对象的本质

作者: 我真的不是张亮 | 来源:发表于2018-08-04 21:49 被阅读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

    相关文章

      网友评论

          本文标题:OC对象的本质

          本文链接:https://www.haomeiwen.com/subject/zvoicttx.html