OC语言 - 内存管理:autorelease | 内存管理原则
autorelease
1 - 工作原理
① 当对一个对象发送 autorelease 消息,就会把这个对象扔到离它最近的自动释放池中;当自动释放池被释放的时候,就会把池中管理的 autorelease 对象逐一拿出来发送一次 release 消息
② autoreleasepool 管理的对象是以栈的管理方式管理 autoreleasepool 对象,先进池的后 release
1 #import <Foundation/Foundation.h> 2 #import "Cat.h" 3 4 int main(int argc, const char * argv[]) { 5 6 Cat *c1 = [[Cat alloc] init]; 7 Cat *c2 = [[Cat alloc] init]; 8 9 // 方式一 10 @autoreleasepool { 11 12 [c1 retain];// 2 13 [c2 retain];// 2 14 [c2 autorelease];// will - 1,但是在池中引用计数依然是 2 15 } // 出池释放 16 NSLog(@"%lu",c1.retainCount);// 2 17 NSLog(@"%lu",c2.retainCount);// 1 18 19 // 方式二 20 NSAutoreleasePool *pool01 = [[NSAutoreleasePool alloc] init]; 21 [c1 retain];// 3 22 [c2 retain];// 2 23 [c1 autorelease]; // will be 2 24 [pool01 release]; // 出池释放 25 NSLog(@"%lu",c1.retainCount);// 2 26 NSLog(@"%lu",c2.retainCount);// 2 27 28 // 就近原则 29 @autoreleasepool { 30 [c1 retain];// 3 31 [c2 retain];// 3 32 [c1 retain];// 4 33 [c1 autorelease];// will -1 标记一 34 @autoreleasepool { 35 [c2 retain];// 4 36 [c1 retain];// 5 37 [c2 retain];// 5 38 [c2 autorelease];// will -1 39 [c1 autorelease];// will -1 标记二 40 } 41 NSLog(@"%lu",[c1 retainCount]);// 4 对应标记二 42 NSLog(@"%lu",[c2 retainCount]);// 4 43 } 44 NSLog(@"%lu",[c1 retainCount]);// 3 对应标记一 45 NSLog(@"%lu",[c2 retainCount]);// 4 46 47 return 0; 48 }
MRC 环境
1 - 内存管理思想
① 自己生成的对象,自己持有
② 非自己生成的对象,自己也能持有
③ 不再需要自己持有的对象时释放
④ 非自己持有的对象无法释放
2 - 内存管理基本原则
① 如果你通过 alloc、new、copy / mutableCopy 等开头的方法来创建了一个对象,那么你就必须调用 release 或 autorelease
② 谁创建,谁释放(个顾个的)
③ 谁 retain,谁释放
小结:MRC 环境
1 - dealloc 就好比是对象的临终遗言 ,一旦重写 dealloc 方法就必须调用 [super dealloc] 并且放在代码块的最后!不能直接调用 dealloc 方法
2 - autorelease 是获取到对象,但不持有对象。它实际上它很类似于 C 语言中自动变量(局部变量)的特性,和 C 语言不同的是我们可以手动管理(创建自动释放池)系统自带的方法中,如果不包含 alloc、new、copy 等关键字,则这些方法返回的对象都是 autorelease!比如我们在定义构造方法时就会使用 autorelease 释放对象
id array = [NSMutableArray arrayWithCapacity:1]; // 方法内部返回的是 aurorelease 对象 // 等同于 id array = [[[NSMutableArray alloc] initWithCapacity:1] autorelease];
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)