要搞懂具体原理,则要先搞清楚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的效率仍然是非常高的, 确实是一个巧妙的设计。 |
|