Objective-C对象底层初探 (一)

493 阅读1分钟

其他文章请点击下方:

  1. Objective-C类和方法底层初探 (二)
  2. 应用加载过程初探 (三)

alloc 底层原理

首先,我们通过一个自定义XLPerson类,实例化两个对象,并打印他们的指针地址,是否一致?

    XLPerson *p = [XLPerson alloc]; 通过类创建的实例对象
    XLPerson *p1 = [p init];
    XLPerson *p2 = [p init];
    NSLog(@"p=%@\np1=%@\np2=%@",p,p1,p2);

结果是一致的,我们接下来分析一下alloc&init内部的实现过程。

汇编分析过程

  1. 打开Xode - Debug - Debug Workflow - Always Show Disassembly
  2. 运行设置断点
  3. 查看 All Variables
  4. 编译器调试命令register read
  5. 添加符号断点 Symbolic BreakPoint (alloc)
  6. LibOjbc.A.dylib 下载源码

alloc源码流程

  1. _objc_rootAlloc
  2. callAlloc
  3. class_createInstance
  4. _class_createInstanceFromZone
    • cls->instanceSize
    • calloc
    • initInstanceIsa

init 源码

  1. _objc_rootInit(id obj)
  2. return obj 工厂设计模式,交由子类自定义重写

编译器优化

设置-build setting - optimization - fast smallest

作用:

  1. 编译时间
  2. 链接时间
  3. 运行时间
  4. 空闲时间

字节对齐

    # define WORD_MASK 7UL
    static inline size_t word_align(size_t x) {
        return (x + WORD_MASK) & ~WORD_MASK;  //按8的倍数增长
    }

对象占用大小是按照8字节对齐

系统分配对象内存算法

 size_t instanceSize(size_t extraBytes) {
     size_t size = alignedInstanceSize() + extraBytes;
     // CF requires all objects be at least 16 bytes.
     if (size < 16) size = 16;
     return size;
 }
 
  //系统开辟内存大小以16倍数
    #define SHIFT_NANO_QUANTUM		4
    #define NANO_REGIME_QUANTA_SIZE	(1 << SHIFT_NANO_QUANTUM)	// 16
    #define NANO_QUANTA_MASK		(NANO_REGIME_QUANTA_SIZE - 1)
    k = (size + NANO_REGIME_QUANTA_SIZE - 1) >> SHIFT_NANO_QUANTUM; // round up and shift for number of quanta
    slot_bytes = k << SHIFT_NANO_QUANTUM;	
 

系统分配内存大小是按照16字节对齐