内存管理(三)AutoreleasePool
前言
本篇接着探索自动释放池的底层原理
准备工作
概念
延迟释放和自动释放池
有些函数、方法需要返回一个对象,而系统可能在该对象被返回之前,就已经销毁了对象。那么为了保证函数、方法返回的对象在被返回之前不被销毁,我们就要使用自动释放池进行延迟销毁(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
深入理解Objective-C中的AutoreleasePool:内存管理与释放机制剖析

本文详细解析了自动释放池的原理,包括延迟释放、autorelease与release操作,以及内存回收的流程。通过实例和源码分析,揭示了自动释放池的底层实现,包括AutoreleasePool对象的drain和release区别,以及如何影响内存管理。
最低0.47元/天 解锁文章
428

被折叠的 条评论
为什么被折叠?



