5-autorelease 的基本使用

0,引入

Person *p = [Persom new];[p release];

[p run];

[p run];

// 希望不立即释放,待 run执行完后再释放

1,自动释放池简介及autorelease简介自动释放池

1)在iOS 运行过程中,会创建无数个池子,这些池子都是以栈的结构存在2)当一个对象调用autorelease 时,会将这个对象放到位于栈顶部的池中

自动释放池的创建

1. 在iOS 5.0 以前

NSAutoreleaseRool *pool = [[NSAutoreleaseRool alloc] init];//代码默认入池

[pool release];

2. 在iOS 5.0 以后

@autoreleasepool {//代码

}

autorelease

是一种支持引用计数的内存管理方式,本质就是一个函数允许暂时存储某个对象,然后在内存池自己排干之后,给每一个发送 release消息注意:发送release消息不代表会释放,看引用计数

2,为什么使用autorelease

OC 的内存管理机制中比较重要的一条规律是:谁申请,谁释放
考虑这种情况,如果一个方法需要返回一个新建的对象,该对象何时释放?方法内部是不会写 release来释放对象的,因为这样做会将对象立即释放而返回一个空对象;调用
者也不会主动释放该对象的,因为调用者遵循“谁申请,谁释放”的原则。那么这个时候,就发
生了内存泄露。

不使用 autorelease存在的问题

针对这种情况,Objective-C 的设计了 autorelease,既能确保对象能正确释放,又能返回有效的
对象。

使用 autorelease的好处

(1)不需要再关心对象释放的时间(2)不需要再关心什么时候调用release3,
autorelease原理

autorelease 实际上只是把对release 的调用延迟了,对于每一个Autorelease,系统只是把该Object 放入了当
前的Autorelease pool 中,当该pool被释放时,该pool 中的所有Object 会被调用Release。

4, autorelease何时释放

对于 autorelease pool本身,会在如下两个条件发生时候被释放(详细信息请参

见第 5条)

1)手动释放 Autorelease pool2)Runloop结束后自动释放

对于 autorelease pool内部的对象

在引用计数的 retain == 0 的时候释放。release和 autorelease
pool的drain都会触发 retain--事件。

5, autorelease的原理

要搞懂具体原理,则要先要搞清楚autorelease 何时会创建。
我们的程序在main()调用的时候会自动调用一个autorelease,然后在每一个Runloop,系统会隐
式创建一个Autorelease pool,这样所有的release pool 会构成一个象CallStack一样的一个栈式
结构,在每一个Runloop 结束时,当前栈顶的Autorelease
pool(main()里的 autorelease)会被 销毁,这样这个pool 里的每个Object会被 release。

可以把 autorelease pool理解成一个类似父类与子类的关系,main()创建了父类,每个Runloop 自
动生成的或者开发者自定义的autorelease pool都会成为该父类的子类。当父类被释放的时候,没有被释放的子类也会被释放,这样所有子类中的对象也会收到release 消息。
那什么是一个Runloop 呢?一个 UI事件,Timer
call, delegate call,一个鼠标事件,键盘按 下(MAC OSX),或者iphone上的触摸事件,异步http 连接下后当接收完数据时,都会是一个新的Runloop。
一般来说,消息循环运行一次是毫秒级甚至微秒级的,因此autorelease的效率仍然是非常高的,确实是一个巧妙的设计。

6-autorelease 注意即错误的使用

1,使用注意:

不是说放到池中的代码都会释放,需要调用 autorelease方法

在释放池外部使用 autorelease无效需要注意 自动释放池的嵌套问题自动释放池,不便存储占用内存较大的对象

2, autorelease的错误用用法连续多次使用autorelease使用自动释放池以后,又 release

7-autorelease 的应用场景1, autorelease的应用场景

创建对象的同时,加入释放池

Person *p = [[[Person alloc] init] autorelease];

2,完善快速创建对象的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

autorelease 的基本使用的更多相关文章

  1. Autorelease返回值的快速释放机制

    + (instancetype)createSark { return [self new];}// callerSark *sark = [Sark createSark]; 编译器改写成了形如下面 ...

  2. 用类方法------>快速创建一个autorelease的对象,在封装的类方法内部

    在封装的类方法内部,也就是+ (id)personWithName:(NSString *)name andAge:(int)age内部: 创建了一个person对象,并且创建了一个person*类型 ...

  3. 理解autorelease

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

  4. RunLoop和autorelease的一道面试题

    有这么一道iOS面试题 以下代码有没有什么问题?如果有?如何解决? for (int i = 0; i < largeNumber; i++) { NSString *str = [NSStri ...

  5. Autorelease自动释放池的使用

    Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到al ...

  6. 2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)

    首先祝自己生日快乐~23咯~ 一  autorelease的概念 autorelease会像C语言的自动变量那样来对待对象实例.当超出作用域(相当于变量作用域)时,对象的实例release实力方法被调 ...

  7. 【引】objective-c,6:Autorelease Pool

    参考博客: http://blog.leichunfeng.com/blog/2015/05/31/objective-c-autorelease-pool-implementation-princi ...

  8. 黑马程序员-autorelease pool

    Autorelease:可以延迟给对象发送release消息.发送一个autorelease消息给对象,证明该对象在一定时间内有效,一定时间后会对该对象进行释放,进行一次release. 一个auto ...

  9. 【原】你真的懂iOS的autorelease吗?

    或许这个题目起得有点太高调了,不过我只是想纠正一些童鞋对于autorelease的认识,如果能帮到几个人,那这篇文章也就值得了!当然,高手请绕道 本文主要探讨两个方面:(1)autorelease对象 ...

  10. retain,copy,assign及autorelease ,strong,weak

    一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a ...

随机推荐

  1. 【CSS】Beginner2:Selectors, Properties, and Values

    1.Whereas HTML has tags,CSS has selectors.   2.Selector{ properties:value; properties2:value2; }   3 ...

  2. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法

    题目: http://codevs.cn/problem/1222/ 1222 信与信封问题   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 钻石 Diamond 题解 ...

  3. 【Java基础】Java异常的一些总结

    什么是异常 异常是指程序运行可能出现的不能正常继续的情况,也可以理解为程序出现了不在预期范围内的一些情况,都可以称之为异常. 异常的分类 所有的异常类是从java.lang.Exception类继承的 ...

  4. C 数据结构1——线性表分析(顺序存储、链式存储)

    之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...

  5. POJ2891 - Strange Way to Express Integers(模线性方程组)

    题目大意 求最小整数x,满足x≡a[i](mod m[i])(没有保证所有m[i]两两互质) 题解 中国剩余定理显然不行....只能用方程组两两合并的方法求出最终的解,刘汝佳黑书P230有讲~~具体证 ...

  6. poj1149--PIGS(最大流)

    题意: 有m个猪圈 每个猪圈有不同数量的猪 [0, 1000]有n个顾客 每个顾客需要Bi头猪 有Ai个钥匙 能打开Ai个不同的猪圈顾客按顺序来买猪 只能买他有钥匙的猪 买完之后 这几个猪圈的猪可以相 ...

  7. 通过分析 JDK 源代码研究 Hash 存储机制

    通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元 ...

  8. HTTP/2 常见问题回答

    常见问题 为什么修订HTTP? HTTP/1.1已经很好的服务Web超过15个年头,但它的劣势开始显现. 载入一个Web页面比之前占用更多的资源(详情可见HTTP压缩页大小统计),有效的载入这些资源很 ...

  9. epoll原理解释(转)

    转自:http://yaocoder.blog.51cto.com/2668309/888374   首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. ...

  10. 关于easyui模拟win2012桌面的一个例子系列

    最近时间比较充裕,想到之前领导问我,什么界面更适合公司这种屏幕小但是又要求可以同时处理更多的工作. 我感觉  windows是最合适的,毕竟微软已经做了这么多年的系统了,人的操作习惯已经被他们确定了. ...