文档章节

关于autorelease pool一个较好的理解

lightUp
 lightUp
发布于 2015/06/17 17:36
字数 689
阅读 13
收藏 0


如果你能够真正的理解autorelease,那么你才是理解了Objective c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。

 

[1]理解autoreleasepool

在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别?

答案是,对于每一个Runloop系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。Autorelease是保证一个method安全的,对于method中的函数调用也适用。例子如下:

NSString* globalObject;

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    globalObject = [[NSString alloc] initWithFormat:@"Test"];
    NSLog(@"Retain count after create: %d", [globalObject retainCount]); // output 1.
    [globalObject retain];
    NSLog(@"Retain count after retain: %d", [globalObject retainCount]); // output 2.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);
    // 输出1. Button click loop finished, it's autorelease pool released, globalObject get released once.
}

-(IBAction)onButtonClicked
{
    [globalObject autorelease];
    NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);
    // 输出2。 Autorelease被call, globalObject被加如当前的AutoreleaePool。
}



[2]为什么需要Auto release ?


2.1) 很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 在下面这个例子中,Func1的调用者不需要再去关心obj的释放。

ClassA *Func1()
{
    ClassA *obj = [[[ClassA alloc]init]autorelease];
    return obj;
}


 

实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。


2.2) autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。


总结:

1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。
2)[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。


本文转载自:http://blog.sina.com.cn/s/blog_8c87ba3b0100tgfs.html

共有 人打赏支持
lightUp
粉丝 10
博文 242
码字总数 287936
作品 0
杭州
程序员
关于autorelease和release的理解

1.如果能够真正的理解autorelease,那么才是理解了Objective c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorel...

张志浩
2013/02/06
0
0
NSAutoReleasePool 讲解

好记性不如烂博客. 今天需要记录的是关于NSAutoReleasePool的理解.(大部分内容来自于iOS4.3 Library) Cocoa的内存管理主要依赖于Reference Counting, 而NSAutoReleasePool就是用来支持它的....

孙启超
2012/05/28
0
1
iPhone/Mac Objective-C内存管理教程和原理剖析

版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所有。欢迎非营利性转载,转载时必须包含原始链接http://vinceyuan.cnblogs.com/,且必须包含此版权声明的完整内容。 版本 1.1 发...

黑衣李白
2012/12/27
0
0
iPhone/Mac Objective-C内存管理教程和原理剖析 【一、基本原理】

前言 初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对objective-C内存管理机制的研究成果和经验,...

长平狐
2012/10/25
46
0
Objective-C 内存管理

写在前面 本文是阅读 Advanced Memory Management Programming Guide 的笔记。 主要内容是关于手动管理内存的规则。 众所周知,Objective-C 它提供了2种内存管理方式: Manual Retain-releas...

JiandanDream
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安全管理标准

安全生产严重等级分类: 故障频次: 风险等级矩阵:

乔老哥
14分钟前
1
0
数据结构“树”的相关微视频

今天在腾讯视频上闲逛,然後发现一个叫“岚人”的用户上传了几段小视频,基本上都在5分钟以内,讲解了关于树的一些结构和算法。零代码,非常适合初学者入门。不过,对于老鸟来说,这也是非常...

Iridium
26分钟前
0
0
10-利用思维导图梳理JavaSE-Java 集合

10-利用思维导图梳理JavaSE-Java 集合 主要内容 1.Collection接口 2.Set接口 2.1.Set接口概述 2.2.HashSet类 2.3.TreeSet类 2.4.SortedSet接口 3.List接口 3.1.List接口概述 3.2.ArrayList类...

飞鱼说编程
37分钟前
3
0
活动推荐|互联网3.0与区块链新时代论坛(北京)

1 时间地点 **时间:**9月22日 14:00 - 18:00 地点:(北京海淀)西大街70号 3w咖啡 二层 2 活动详情 Harmony创始人Stephen及团队将介绍他们的区块链分片扩容技术。Stephen曾任Apple地图服务...

HiBlock
55分钟前
1
0
如何优雅的删除Redis的大key

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的...

IT--小哥
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部