自动释放池原理
2015-10-20 21:48
246 查看
autorelease:即延迟释放。
自动释放池的作用:在程序执行完毕即池子即将销毁的时候会对池子中所有调用autorelease的对象进行一次release操作。
面试题一:自动释放池什么时候创建,什么时候销毁?
每一次运行循环执行后,也就是每当事件被触发时都会创建自动释放池。在程序执行的过程中,所有autorelease的对象在出了作用域之后会被添加到最近创建的自动释放池中。运行循环结束前会释放自动释放池,还有池子满了也会销毁。
其工作原理是:自动释放池被销毁或耗尽时会向池中的所有对象发送release消息,释放所有autorelease对象。
面试题二:
int largeNumber = 2 * 1024 * 1024;
/* 问题:(1)以下代码是否存在问题?(2)如果有,怎么修改?
网上的解决办法:
1)@autoreleasepool 放在外面,保证循环之后释放循环中的自动释放对象,适用于创建对象次数不太大的循环。
2)@autoreleasepool 放在内部,每一次循环之后,都倾倒一次自动释放池,内存管理是最好的,但是性能不好!适用于创建对象次数很大的循环。
*/
for (int i = 0; i < largeNumber; i++) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"Hello "];
str = [str uppercaseString];
str = [str stringByAppendingString:@" - World"];
}
}
![](http://img.blog.csdn.net/20151020214744948?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意:每一个线程都有一个RunLoop,但是只有主线程的RunLoop(运行循环)会默认启动。也就意味着不会自动创建自动释放池,子线程里面autorelease的对象也就意味着没有池子可存放,也就意味着在后面无法进行释放,造成内存泄露。在使用NSThread做多线程开发时,需要在线程调度方法中手动添加自动释放池。@autorelease{ // 执行代码 }
需要特别注意的是:如果没有使用alloc new copy retain 方法而创建了对象,则内部全是使用了autorelease方法。所以使用自动释放池能对这些对象进行及时释放。
自动释放池的作用:在程序执行完毕即池子即将销毁的时候会对池子中所有调用autorelease的对象进行一次release操作。
面试题一:自动释放池什么时候创建,什么时候销毁?
每一次运行循环执行后,也就是每当事件被触发时都会创建自动释放池。在程序执行的过程中,所有autorelease的对象在出了作用域之后会被添加到最近创建的自动释放池中。运行循环结束前会释放自动释放池,还有池子满了也会销毁。
其工作原理是:自动释放池被销毁或耗尽时会向池中的所有对象发送release消息,释放所有autorelease对象。
面试题二:
int largeNumber = 2 * 1024 * 1024;
/* 问题:(1)以下代码是否存在问题?(2)如果有,怎么修改?
网上的解决办法:
1)@autoreleasepool 放在外面,保证循环之后释放循环中的自动释放对象,适用于创建对象次数不太大的循环。
2)@autoreleasepool 放在内部,每一次循环之后,都倾倒一次自动释放池,内存管理是最好的,但是性能不好!适用于创建对象次数很大的循环。
*/
for (int i = 0; i < largeNumber; i++) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"Hello "];
str = [str uppercaseString];
str = [str stringByAppendingString:@" - World"];
}
}
注意:每一个线程都有一个RunLoop,但是只有主线程的RunLoop(运行循环)会默认启动。也就意味着不会自动创建自动释放池,子线程里面autorelease的对象也就意味着没有池子可存放,也就意味着在后面无法进行释放,造成内存泄露。在使用NSThread做多线程开发时,需要在线程调度方法中手动添加自动释放池。@autorelease{ // 执行代码 }
需要特别注意的是:如果没有使用alloc new copy retain 方法而创建了对象,则内部全是使用了autorelease方法。所以使用自动释放池能对这些对象进行及时释放。
相关文章推荐
- 数组名与指针的区别
- LeakCanary 中文使用说明
- linux内核分析之system_call.s
- iOS代码设置渐变背景色
- 信息安全系统设计基础 第7周学习笔记
- (原创)c#学习笔记04--流程控制03--分支03--switch语句
- 20151017的NOIP模拟赛
- GCD 学习总结
- 安装rackspace private cloud --3 Deployment host
- 33.Word Pattern
- Vim中的查找和替换
- Node之锚点
- 安装rackspace private cloud --2 overview
- JavaScript学习随记——数组二
- 深度优先遍历之边的分类
- 程序员既要写好代码,又要写好文档
- 面试题40:数组中只出现一次的数字
- iOS改变UIImageView的image时添加渐变
- srm 552
- eclipse或myeclipse常用配置和快捷键