什么时候创建autoreleasepool,什么时候销毁

什么时候会创建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?
当不需要精确地控制对象的释放时间时,可以手动创建自动释放池

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值