AutoreleasePool如何实现?一个autorealese对象/block在什么时刻释放?

在Objective-C中,AutoreleasePool是由NSAutoreleasePool类实现的。它使用了一个栈结构来管理自动释放池的创建和销毁。

AutoreleasePool的实现原理如下:

  1. 创建AutoreleasePool:在每个run loop迭代开始之前,会创建一个新的AutoreleasePool对象,通过调用NSAutoreleasePoolnew方法来创建。

  2. 添加对象:当一个对象调用autorelease方法时,该对象会被添加到当前的AutoreleasePool中。添加的方式是将对象放入AutoreleasePool的栈顶元素(innermost pool)中。

  3. 销毁AutoreleasePool:当一个AutoreleasePool的作用域结束时,它会被销毁。销毁操作会依次向栈中的每个AutoreleasePool发送一条drain消息。

  4. 释放对象:在AutoreleasePool被销毁时,会向其中的每个对象发送一条release消息,从而释放这些对象。这个过程是通过遍历栈中的每个AutoreleasePool来完成的。

需要注意的是,每个AutoreleasePool对象实际上是一个链表结构,它们通过一个指针串联起来。当一个AutoreleasePool被销毁时,会向它所包含的每个对象发送release消息,并将这些对象从内存中释放。同时,被释放的AutoreleasePool会从链表中移除,下一个AutoreleasePool成为当前的栈顶元素。

AutoreleasePool的实现使得我们可以更方便地使用自动释放对象,避免手动管理内存的繁琐工作。它在开发中广泛应用于处理临时对象,减少内存占用和提高性能。

autoreleasePool实现原理详解_autoreleasepool原理-优快云博客

[iOS] AutoreleasePool实现原理 - 简书

AutoreleasePool底层实现原理

一个autorealese对象在什么时刻释放?  

在 @autoreleasepool中。

1.有的是在 autoreleasepool结束时,池中的自动释放对象会被清理;

2.有的事在RunLoop空闲时去清理。

这两种情况,都在什么情况下发生呢

优质链接:

https://juejin.cn/post/6980269663120785438 

ChatGPT 说:

ChatGPT

在 iOS 和 macOS 中,@autoreleasepool 和 RunLoop 协同工作,用于管理内存和自动释放对象。在不同的上下文中,自动释放池(autorelease pool)对象的清理时机可以有所不同,具体情况通常依赖于 当前线程是否有活动的 RunLoop 和 @autoreleasepool 块的执行时机

1. 在 @autoreleasepool 结束时清理对象

这是最常见的情况。在 非 RunLoop 状态 下,尤其是没有显式 RunLoop 循环的线程,自动释放池中的对象会在当前的 @autoreleasepool 块结束时被清理。也就是说,当你执行完 @autoreleasepool 块的代码时,池中的所有自动释放对象会立即被释放。

典型情况:
  • 在 子线程 或 后台线程 中使用 @autoreleasepool
  • @autoreleasepool 块没有与 RunLoop 结合使用的场景。
示例:
 

swift

复制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值