自动释放池触发释放的情况:
- 正常生命周期结束:当自动释放池块结束时,池内的对象会被释放。例如在
@autoreleasepool
代码块中,当代码执行到块的末尾,池内对象会被释放。
@autoreleasepool {
NSString *str = [[NSString alloc] initWithFormat:@"Hello"];
// str会在这个块结束时被自动释放
}
- 主线程的自动释放池:在主线程的每次循环结束时,主线程自动释放池会被释放并重建。这意味着在主线程中创建并自动释放的对象,会在当前事件循环结束时被释放。
背后工作原理:
- 对象的自动释放:当一个对象调用
autorelease
方法时,它并不会立即被释放,而是被添加到最近的自动释放池中。自动释放池实际上是一个栈结构的数据结构。
- 释放机制:当自动释放池被释放时,它会向池内的每个对象发送
release
消息。如果对象的引用计数在收到release
消息后降为0,对象就会被销毁并释放其占用的内存。例如,一个对象引用计数为1,调用autorelease
添加到池后,当池释放发送release
消息,对象引用计数变为0,对象被销毁。
- 嵌套自动释放池:可以存在多个嵌套的自动释放池,对象会被添加到最近的自动释放池中。当内层自动释放池释放时,仅释放内层池中的对象,外层池不受影响。
@autoreleasepool {
@autoreleasepool {
NSString *str = [[NSString alloc] initWithFormat:@"Inner"];
// str在内层自动释放池结束时被释放
}
// 外层自动释放池继续执行其他代码
}