autorelease是一种支持引用计数的内存管理方式。
它可以暂时的保存某个对象(object),然后在内存池被释放的时候,其中的每个对象发送release消息, 注意,这里只是发送release消息,如果当时的引用计数(reference-counted)依然不为0,则该对象依然不会被释放。可以用该方法来保存某个对象,也要注意保存之后要释放该对象
autorelease可以通过NSAutoreleasePool创建实例。
autorelease的用法
当你创建一个对象的时候,你就会自动的return一次,那你什么时候进行释放呢,当然你可以在合适的实际进行release,也不可以在方法内部进行释放,那会返回一个空对象,autorelease的运用其本质就是延迟了release的时间。好处就在于创建完对象之后不用在考虑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的效率仍然是非常高的,确实是一个巧妙的设计。