1. Block内存布局核心解析
在Objective-C和Swift混编环境中,Block作为闭包实现的核心机制,其内存布局直接影响着代码执行效率和内存安全。一个典型的Block在内存中由以下六个部分组成:
c复制struct Block_layout {
void *isa; // 8字节,指向类对象
volatile int32_t flags; // 4字节,状态标识位
int32_t reserved; // 4字节,保留字段
void (*invoke)(void *, ...); // 8字节,函数指针
struct Block_descriptor *descriptor; // 8字节,描述信息
// 捕获的变量紧随其后...
};
1.1 关键字段深度剖析
isa指针:
- 对于全局Block(NSConcreteGlobalBlock)指向_NSConcreteGlobalBlock类
- 栈Block(NSConcreteStackBlock)指向_NSConcreteStackBlock类
- 堆Block(NSConcreteMallocBlock)指向_NSConcreteMallocBlock类
flags字段的位掩码含义:
code复制enum {
BLOCK_DEALLOCATING = 0x0001, // 正在释放
BLOCK_REFCOUNT_MASK = 0xfffe, // 引用计数掩码
BLOCK_NEEDS_FREE = 0x00010000, // 需要手动释放
BLOCK_HAS_COPY_DISPOSE = 0x00020000, // 有拷贝/销毁辅助函数
BLOCK_HAS_CTOR = 0x00040000, // 含有C++构造/析构
BLOCK_IS_GC = 0x00080000, // 垃圾回收环境
BLOCK_IS_GLOBAL = 0x00100000, // 全局Block
BLOCK_USE_STRET =
