自动释放池
2016-11-16 15:01
72 查看
自动释放池
作用自动释放对象的
所有
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"];
}
}
}
实际测试结果,是运行循环放在内部的速度更快!
日常开发中,如果遇到局部代码内存峰值很高,可以引入运行循环及时释放延迟释放对象
相关文章推荐
- 【读书笔记】iOS-自动释放池
- oracle学习笔记 temp空间不足不能自动释放的解决办法
- OC学习笔记之autorelease与自动释放池
- OC手动内存管理-临时对象与事件循环中的自动释放池
- Linux 每天自动释放系统内存的脚本
- 自动释放系统资源
- 单例模式——C++实现自动释放单例类的实例
- 动态内存会被自动释放吗?杜绝“野指针”(转载)
- IOS自动释放池
- 自动释放池的工作流程
- iOS内存管理系列之二:自动释放与便捷方法
- C++ 返回的内容自动释放
- 自动释放池 ARC机制
- 18.链表管理内存实现c语言自动释放内存
- c#:使用using关键字自动释放资源未必一定就会有明显好处(转)
- 自动释放系统资源
- Java 7 try-with-resources 语句,自动资源释放,提高容错率!
- 自动释放内存!Facebook推出强大Android图片库Fresco
- 关于oc中NSString 的stringWithFormat和substringFromIndex自动释放问题
- 动态分配资源的自动释放 - auto_ptr的实现原理