内存管理(三)AutoreleasePool

深入理解Objective-C中的AutoreleasePool:内存管理与释放机制剖析
本文详细解析了自动释放池的原理,包括延迟释放、autorelease与release操作,以及内存回收的流程。通过实例和源码分析,揭示了自动释放池的底层实现,包括AutoreleasePool对象的drain和release区别,以及如何影响内存管理。

内存管理(三)AutoreleasePool

前言

本篇接着探索自动释放池的底层原理

准备工作

Objc-818.2

概念

延迟释放和自动释放池

有些函数、方法需要返回一个对象,而系统可能在该对象被返回之前,就已经销毁了对象。那么为了保证函数、方法返回的对象在被返回之前不被销毁,我们就要使用自动释放池进行延迟销毁(NSAutoreleasePool)

所谓自动释放池,是指它是一个存放对象的容器(集合),而自动释放池会保证延迟销毁该池中所有的对象。出于自动释放池的考虑,所有的对象都应该添加到自动释放池中,这样可以让自动释放池在销毁之前,先销毁池中的所有对象

对象的 autorelease 和 release

autorelease方法,不会改变对象的引用计数,只是将该对象添加到自动释放池中。该方法会返回调用该方法的对象本身

当程序在自动释放池上下文中调用某个对象的autorelease方法时,该方法只是将对象添加到自动释放池中,当该自动释放池释放时,自动释放池会让池中所有的对象执行release方法

自动释放池的销毁和其他普通对象相同,只要其引用计数为0,系统就会自动销毁自动释放池对象。系统会在调用NSAotoreleasePool的dealloc方法时回收该池中的所有对象

AutoreleasePool对象的 drain 和 release

NSAutoreleasePool还提供了一个drain方法来销毁自动释放池中的对象。与release不同,release会使自动释放池自身的引用计数变为0,从而让系统回收NSAutoreleasePool对象,在回收NSAutoreleasePool对象之前,系统会回收该池中的所有对象。而drain方法则只是回收池中的所有对象,并不会销毁自动释放池

运行逻辑

AutoReleasePool是OC的内存自动回收机制,将加入到AutoReleasePool中的变量release时机延迟。在正常情况下,创建的变量会在超出其作用域的时候应该release,但是如果将变量加入AutoreleasePool,那么release将延迟执行,即使超出作用域也不会立即释放,直到runloop休眠或者超出AutoReleasePool作用域才会释放

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QF8XDR5K-1646302649041)(media/16391957881083/25800336-aa25e8b931ffd4c0.webp)]

程序启动到加载完成,主线程对应的Runloop处于休眠状态,直到用户点击交互唤醒Runloop
用户每次交互都会启动一次Runloop用来处理用户的点击、交互事件
Runloop被唤醒后,会自动创建AutoReleasePool,并将所有延迟释放的对象添加到AutoReleasePool
在一次完整的Runloop执行结束前,会自动向AutoReleasePool中的对象发送release消息,然后销毁AutoReleasePool

效果分析

 NSString *str1 = [[NSString alloc] initWithFormat:@"hellowwwwwwww"];

汇编

    0x102633ec0 <+0>:  pushq  %rbp
    0x102633ec1 <+1>:  movq   %rsp, %rbp
    0x102633ec4 <+4>:  subq   $0x20, %rsp
    0x102633ec8 <+8>:  movq   %rdi, -0x8(%rbp)
    0x102633ecc <+12>: movq   %rsi, -0x10(%rbp)
    0x102633ed0 <+16>: movq   0x74e1(%rip), %rax        ; (void *)0x00007fff8026c0f8: NSString
    0x102633ed7 <+23>: movq   %rax, %rdi
    0x102633eda <+26>: callq  0x102634450               ; symbol stub for: objc_alloc
    0x102633edf <+31>: leaq   0x2132(%rip), %rcx        ; @"hellowwwwwwww"
    0x102633ee6 <+38>: movq   0x74b3(%rip), %rsi        ; "initWithFormat:"
    0x102633eed <+45>: movq   %rax, %rdi
    0x102633ef0 <+48>: movq   %rcx, %rdx
    0x102633ef3 <+51>: movb   $0x0, %al
    0x102633ef5 <+53>: callq  *0x2105(%rip)             ; (void *)0x00007fff20175280: objc_msgSend
    0x102633efb 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值