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];

 

posted on   低头捡石頭  阅读(30)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示