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。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗重度中暑昏迷怎么办 孩子中暑了呕吐怎么办 一岁宝宝中暑怎么办 骑摩托车下雨了怎么办 棉袄脏了不想洗怎么办 棉袄袖口特别脏怎么办 没有扣眼的腰带怎么办 消防部队改革士兵怎么办 84洗衣服手剥皮怎么办 羊毛裤水洗了怎么办 小公司开支亏损怎么办 带上耳塞后耳鸣怎么办 鞋子拉链磨脚怎么办 科目三系统误判怎么办 遇到障碍物老熄火怎么办 高速上遇到动物怎么办 高速上有障碍物怎么办 雨刮器工作遇到障碍物怎么办 高速路上遇到障碍物怎么办 开车撞到柱子怎么办 喝酒撞了护栏怎么办 漏电保护器过载怎么办 不停有国外电话怎么办 身体铅含量高怎么办 洗衣机买大了怎么办 三角插头坏了怎么办 移动硬盘读不出来怎么办 高压线断落地面怎么办 水冷螺杆机制热怎么办 施工升降机突然停电怎么办 高压锅煮饭响了怎么办 美的高压锅漏气怎么办 电压力锅盖漏气怎么办 电饭锅焦粘锅底怎么办 电饭锅煮焦了怎么办 九阳压力锅漏气怎么办 高压锅排气阀漏气怎么办 电锅漏电麻手怎么办 美的pss5032漏气怎么办 九阳电饭煲坏了怎么办 电饭煲外壳坏了怎么办