对autorelease的理解

来源:互联网 发布:js判断平年闰年的方法 编辑:程序博客网 时间:2024/05/23 19:17

一.对于autorelease pool本身,会在什么条件下会被释放

1.手动释放Autorelease pool

2)Runloop结束后自动释放


二.对于autorelease pool内部的对象,会在什么条件下被释放

在retain == 0的时候释放

注意:autorelease结束,只是对释放池中的对象release一次,对象并不一定会被释放


三.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的效率仍然是非常高的,确实是一个巧妙的设计。 


例题:

NSObject *temp = [[[NSObjectalloc]init]autorelease];请问temp什么时候会被释放

答:temp的retainCount为0时,会被释放




0 0