autorelease深层次学习
来源:互联网 发布:php 按小时区间时间轴 编辑:程序博客网 时间:2024/05/24 00:13
在前面的博文中也写了关于内存管理的一些知识,但总有一些东西不得深入理解,也留下了不少的疑问。这次在学习了新的知识后,又经过项目的实践,使得一些问题得到一些解答,虽不是最深层次的学习,但也是一个开端!
Autorelease对象什么时候释放?
在没有手动加入Autorelease Pool的情况下,Autorelease对象是在当前的runLoop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和pop。
实验:
__weak id reference = nil;
- (void)viewDidLoad {
[super viewDidLoad]; NSString *str = [NSString stringWithFormat:@"sunnyxx"]; // str是一个autorelease对象,设置一个weak的引用来观察它
reference = str;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated]; NSLog(@"%@", reference); // Console: sunnyxx}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated]; NSLog(@"%@", reference); // Console: (null)}
由于这个VC在loadView之后便add到了window层级上,所以viewDidLoad和viewWillAppear是在同一个runloop调用的,因此在viewWillAppear中,这个autorelease是有值的,但在viewDidAppear中是没有值的。
当然我们也可以手动干预Autorelease对象的释放时机:
- (void)viewDidLoad
{
[super viewDidLoad];
@autoreleasepool { NSString *str = [NSString stringWithFormat:@"sunnyxx"];
} NSLog(@"%@", str); // Console: (null)}
}
详细可参见:http://www.devstore.cn/new/newInfo/888.html
遗留问题:
系统内部的runloop是何时创建,何时结束,“loadview后便加入到了window层级上,所以viewDidLoad和viewWillAppear是在同一个runloop调用的”? 那么viewDidAppear是在哪一个runloop中,如何判断,在启动过程中共有多少个runloop。
一种说法:
对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的release pool 会构成一个像callstack一样的栈式结构,在每一个Runloop结束后,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个object会被release。
那么什么是一个runloop?一个UI事件,Timer call, delegate call,都会是一个新的Runloop。
autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。
总结:
1> 一定要注意Autorelease pool的生命周期,理解Runloop,避免在对象被释放后使用用。 (注意其生命周期)
2> [NSString stringWithFormat:]这类函数返回的对象是不需要再自已release的,它已经被添加到autorelease了,如果你想把它当成一个全局对象使用,那必须自己再retain,释放时再release。
- autorelease深层次学习
- autorelease学习
- const常量深层次学习!!
- 怎么深层次的学习编程
- Autorelease的学习
- ios学习之autorelease pool
- OC学习笔记之autorelease
- autorelease
- autorelease
- autorelease
- autorelease
- @autorelease
- autorelease
- Autorelease
- Autorelease
- autorelease
- autorelease
- autorelease
- [LeetCode] Add Two Sum
- macbook上网没问题但是无法连接到app store的解决办法
- 学习html(6)
- Python中list去重
- iOS面试题1-25
- autorelease深层次学习
- 归并排序(Merge sort)
- C++ 顺序容器的安全随机访问
- IOS APP上传容易出现的错误
- centos6安装epel
- mac系统eclipse用android第三方模拟器genymotion调试程序
- 仿新浪微博的插入#话题#
- 队列基本操作
- wireshark学习2之查询统计