autorelease其实就是把release的调用延迟,对于每一个autorelease来讲,系统只是把该对象放在当前的autorelease中,当pool释放的时候该pool里的对象才会被调用release。
问题1:在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
问题2.autorelease完全不可控,不知道什么时候真正被释放掉。哪里好?为什么要使用autorelease?
他有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放。该函数的调用者不需要关心他内部申请对象的管理。