黑马程序员技术交流社区
标题: OC学习笔记之autorelease基本使用 [打印本页]
作者: chunhuayun 时间: 2015-10-7 00:20
标题: OC学习笔记之autorelease基本使用
1、自动释放池及autorelease介绍
【自动释放池】
1)在ioc程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。
2)当一个对象调用autorelea时,会将这个对象放到位于栈顶得释放池中
【自动释放池的创建方式】
1)ios5.0以后
- @autoreleasepool {
- //这个大括号内部就是自动释放池
- }
复制代码
【autorelease】
是一种支持引用技术的内存管理方式
它可以【暂时保存某个对象】,然后再内存池自己的排干(drain)的时候对其中的每个对象发送release消息
【注意】这里只是发送release消息,如果当时的引用技术依然不为0,那么该对象依然不会被释放,可以用该方法来保存某个对象,但也要注意之后要释放该对象。
2、为什么会有autorelease
oc的内存管理机制中比较重要的一条就是:谁申请,谁释放。
考虑到这种情况,如果一个方法需要返回一个新建的对象,该对象何时释放?
方法内部是不会写release来释放对象的,因为这样做会将对象立即释放而返回一个空对象,调用者也不会主动释放该对象,因为调用者遵循【谁申请,谁释放】的原则,那么这个时候就会发生内存泄露。
【使用autorelease的好处】
1)不需要关心对象释放的时间
2)不需要关心什么时候调用release
3、autorelease的基本用法
【基本用法】
1)会将对象放到一个自动释放池中
2)当自动释放池被销毁时,会对池子里所有的对象发送release消息
3)会返回对象本身
4)调用完autore方法后,下属方法是合理的,即可以争取返回结果,也不会造成内存泄露
例如:
- Person *p = [Person new];
- @autoreleasepool {
- [p run];
- NSLog(@"retainCount = %lu",p.retainCount);
- //作用,把p加入到自动释放池
- [p autorelease];
- [p run];
- NSLog(@"retainCount = %lu",p.retainCount);
-
- }
- //此时在调用会报错(开启僵尸对象检测)
- //[p run];
复制代码
打印结果;
2015-10-06 16:50:12.915 MRCDemo[2407:303] This personrun....
2015-10-06 16:50:12.917 MRCDemo[2407:303] retainCount= 1
2015-10-06 16:50:12.918 MRCDemo[2407:303] This personrun....
2015-10-06 16:50:12.918 MRCDemo[2407:303] retainCount= 1
2015-10-06 16:50:12.919 MRCDemo[2407:303] This persondead....
【分析结果】
p最后被自动释放了
【如果autoreleasepool销毁时对象的计数器仍不为0,就会出现内存泄露】
例如:
- Person *p = [Person new];
- @autoreleasepool {
- [p run];
- NSLog(@"retainCount = %lu",p.retainCount);
- [p retain]; //计数器+1
- //作用,把p加入到自动释放池
- [p autorelease];
- [p run];
- NSLog(@"retainCount = %lu",p.retainCount);
-
- }
复制代码
打印结果:
2015-10-06 16:45:18.274 MRCDemo[2326:303] retainCount= 1
2015-10-06 16:45:18.276 MRCDemo[2326:303] retainCount= 2
作者: 卫博生 时间: 2015-10-7 20:16
复制粘贴的吗?一下子发这么多帖子
作者: chunhuayun 时间: 2015-10-7 20:25
自己边学习边做笔记,等晚上整理后再统一发,这样节省时间
作者: zhuaihuo1744 时间: 2015-10-7 21:30
很好很好。
作者: 卫博生 时间: 2015-10-8 12:21
这样子奖励你更多的是黑马币还是技术分?
作者: sclea 时间: 2015-10-8 19:41
写得已经非常详细了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |