MST

星途 面试题库

面试题:Objective-C中自动释放池的触发时机及原理

请详细阐述在Objective-C中自动释放池通常在哪些情况下会被触发释放,以及其背后的工作原理是什么。
35.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

自动释放池触发释放的情况:

  1. 正常生命周期结束:当自动释放池块结束时,池内的对象会被释放。例如在@autoreleasepool代码块中,当代码执行到块的末尾,池内对象会被释放。
@autoreleasepool {
    NSString *str = [[NSString alloc] initWithFormat:@"Hello"];
    // str会在这个块结束时被自动释放
}
  1. 主线程的自动释放池:在主线程的每次循环结束时,主线程自动释放池会被释放并重建。这意味着在主线程中创建并自动释放的对象,会在当前事件循环结束时被释放。

背后工作原理:

  1. 对象的自动释放:当一个对象调用autorelease方法时,它并不会立即被释放,而是被添加到最近的自动释放池中。自动释放池实际上是一个栈结构的数据结构。
  2. 释放机制:当自动释放池被释放时,它会向池内的每个对象发送release消息。如果对象的引用计数在收到release消息后降为0,对象就会被销毁并释放其占用的内存。例如,一个对象引用计数为1,调用autorelease添加到池后,当池释放发送release消息,对象引用计数变为0,对象被销毁。
  3. 嵌套自动释放池:可以存在多个嵌套的自动释放池,对象会被添加到最近的自动释放池中。当内层自动释放池释放时,仅释放内层池中的对象,外层池不受影响。
@autoreleasepool {
    @autoreleasepool {
        NSString *str = [[NSString alloc] initWithFormat:@"Inner"];
        // str在内层自动释放池结束时被释放
    }
    // 外层自动释放池继续执行其他代码
}