刀哥多线程自动释放池autoreleasepool
2015-08-15 23:41
363 查看
自动释放池
作用自动释放对象的
所有
autorelease的对象,在出了作用域之后,会被自动添加到
最近创建的自动释放池中
自动释放池被销毁或者耗尽时,会向池中所有对象发送
release消息,释放池中对象
自动释放池,在
ARC&
MRC程序中,同样有效
高级面试题:
自动释放池是什么时候创建的?什么时候销毁的?创建,运行循环检测到事件并启动后,就会创建自动释放池
销毁:一次完整的运行循环结束之前,会被销毁
常见面试题
for (long i = 0; i < largeNumber; ++i) { NSString *str = [NSString stringWithFormat:@"hello - %ld", i]; str = [str uppercaseString]; str = [str stringByAppendingString:@" - world"]; }
提问:以上代码是否有问题?如果有,如何解决?
解决方法:引入自动释放池
1> 外面加自动释放池(快):能够保证for循环结束后,内部产生的自动释放对象,都会被销毁
需要等到 for 结束后,才会释放内存
2> 里面加自动释放池(慢):能够每一次 for 都释放产生的自动释放对象!
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"start");
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
[self answer1];
NSLog(@"外 %f", CFAbsoluteTimeGetCurrent() - start);
start = CFAbsoluteTimeGetCurrent();
[self answer2];
NSLog(@"内 %f", CFAbsoluteTimeGetCurrent() - start);
}
- (void)answer1 {
@autoreleasepool {
for (long i = 0; i < largeNumber; ++i) { NSString *str = [NSString stringWithFormat:@"hello - %ld", i]; str = [str uppercaseString]; str = [str stringByAppendingString:@" - world"]; }
}
}
- (void)answer2 {
for (long i = 0; i < largeNumber; ++i) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
str = [str uppercaseString];
str = [str stringByAppendingString:@" - world"];
}
}
}
实际测试结果,是运行循环放在内部的速度更快!
日常开发中,如果遇到局部代码内存峰值很高,可以引入运行循环及时释放延迟释放对象
相关文章推荐
- UVa 11292 - Dragon of Loowater
- 网络路由设计基础
- SimpleDateFormat bug排查
- polya计数回顾
- vijos - P1223麦森数 (高精度乘法 + 分治 + python)
- 自己定义一个依赖属性 Wpf
- matlab通过摄像头获取图像进行处理
- NET下三种缓存机制(Winform里面的缓存使用 )
- LeetCode:Lowest Common Ancestor of a Binary Tree
- 通过GemBox.Spreadsheet完美操作Excel
- 如何让项目使用myEclipse部署成tomcat的ROOT目录
- PHP学习笔记-非常有用的 PHP 代码片段(1)
- python中的map、filter、reduce函数
- 关于导航栏全屏横滑返回
- Java基础之IO
- BZOJ1709超级弹珠
- wpf 不同状态下的图片颜色转换器
- iOS概念入门学习-OC-类的继承和派生
- windows下如何快速优雅的使用python的科学计算库?
- 矩阵快速幂模板