什么时候会创建autoreleasepool?
线程启动runloop后自动生成NSAutoreleasePool接受对象,当当前runloop迭代结束时,释放该pool.
enumerateObjectUsingBlock:,系统在这类快速遍历方法中会自动添加autoreleasepool.
什么时候需要手动创建autoreleasepool?
非UI框架
大量临时变量
辅助线程
自动释放池
自动释放池底层怎么实现?
(以栈的方式实现的)(系统自动创建,系统自动释放)栈里面的(先进后出)
内存里面有栈,栈里面有自动释放池。
自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除,并且会给池子里面所有的对象都会做一次release操作。
在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
什么是自动释放池?
答:自动释放池是用来存储多个对象类型的指针变量
自动释放池对池内对象的作用?
被存入到自动释放池内的对象,当自动释放池被销毁时,会对池内的对象全部做一次release操作
自动释放池作用
将对象与自动释放池建立关系,池子内调用 autorelease 方法,在自动释放池销毁时销毁对象,延迟 release 销毁时间
对象如何放入到自动释放池中?
当你确定要将对象放入到池中的时候,只需要调用对象的 autorelease 对象方法就可以把对象放入到自动释放池中
多次调用对象的autorelease方法会导致什么问题?
答:多次将地址存到自动释放池中,导致野指针异常
自动释放池,什么时候创建?
程序刚启动的时候,也会创建一个自动释放池
产生事件以后,运行循环开始处理事件,就会创建自动释放池
什么时候销毁的?
程序运行结束之前销毁
事件处理结束以后,会销毁自动释放池
还有在池子满的时候,也会销毁
autorelease的对象是在什么时候被release的?
答:autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的 Autoreleasepool中,当该pool被释放时,该pool中的所有Object会被调用Release。对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的releasepool会构成一个象CallStack一样的一个栈式结构,在每一个 Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。
If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?
系统会默认会不定时地创建和销毁自动释放池
When you will create an autorelease pool in your application?
当不需要精确地控制对象的释放时间时,可以手动创建自动释放池