(五十八)NSObject实现多线程、自动释放池的补充
模拟一个图片下载的场景,图片的下载需要2s,在这期间为了保证程序的流畅,应该把图片的下载放在子线程中进行。
使用NSObject的方法performSelectorInBackground方法即可实现:
[self performSelectorInBackground:@selector(setImagePath:) withObject:@"Icon"]
Tip:imageView的sizeToFit方法可以实现imageView自适应图片大小。
这样带来了一个疑惑,选择器中的方法在子线程中更新了UI,苹果官方允许在使用performSelectorInBackground: withObject:方法来后台更新UI,但是不建议这么做。
应该使用另一个方法:
如果最后一个参数为YES,会阻塞线程直到方法调用完毕,NO则不会阻塞线程。
performSelectorOnMainThread: withObject: waitUntilDone:
【注意】
虽然这个方法看起来很简便,但是不能自动回收线程,如果并发数多,会建立大量的子线程。
使用NSThread的线程不会自动添加autoreleasepool。
自动释放池autorelease的补充:
1.当自动释放池被销毁或者耗尽(填满)时,对池中所有对象发送release消息。
2.所有的autorelease对象在出了作用域后会自动添加到最近一次创建的自动释放池中(自动释放池可嵌套)。
3.主线程中有自动释放池,使用GCD和NSOperation也会添加自动释放池。
4.NSThread和NSObject不会添加自动释放池,需要手动使用自动释放池,否则会出现内存泄漏。
5.ARC的原理是在编译过程中自动根据代码结构添加retain和release,因此ARC中仍需要自动释放池。
因此需要在使用到上面方法的时候要加上autoreleasepool来操作。
一道关于autoreleasepool的面试题:
for (int i = 0; i < 10; i++) {
// 新指针
NSString *str = @"abcdef";
// 又一个指针
str = [str uppercaseString];
// 再一个新指针
str = [NSString stringWithFormat:@"%@ %d",str,i];
NSLog(@"%@",str);
}
多次创建指针,会占用栈的空间,在主线程中,栈仅有1M的空间,如果循环次数较大会占用很大的栈空间。
为了在出了作用域后指针被销毁,应当使用自动释放池:
@autoreleasepool {
for (int i = 0; i < 10; i++) {
// 新指针
NSString *str = @"abcdef";
// 又一个指针
str = [str uppercaseString];
// 再一个新指针
str = [NSString stringWithFormat:@"%@ %d",str,i];
NSLog(@"%@",str);
}
}
如果循环次数大到一次循环都会造成自动释放池被填满,应当把池子放到循环内:
for (int i = 0; i < 10; i++) {
@autoreleasepool {
// 新指针
NSString *str = @"abcdef";
// 又一个指针
str = [str uppercaseString];
// 再一个新指针
str = [NSString stringWithFormat:@"%@ %d",str,i];
NSLog(@"%@",str);
}
}
(五十八)NSObject实现多线程、自动释放池的补充的更多相关文章
- 刀哥多线程自动释放池autoreleasepool
自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...
- 04-OC属性的使用、自动释放池、封装和继承
目录: 一.IOS6声明式属性的使用 二.autoreleasepool自动释放池 三.封装.继承 回到顶部 一.IOS6声明式属性的使用 注:声明式属性默认情况下,并没有解决内存问题, 当使用@pr ...
- OC_内存管理(二)对象复制、循环引用问题、自动释放池
循环调用: 1.循环引用的问题 两个对象A.B,有可能会出现特殊情况:A中包含B的实例变量:B中也包含A的实例变量,如果这两个实例变量都是强引用(A有着B的实例变量所有权,B也有A的实例变量所有权 ...
- OC之property和自动释放池
property实例 property参数 自动释放池 一.property实例 1.前边的例子我们看到,我们在一个类中如果用到另外一个类的实例作为自己的成员变量时,通常需要在setter方法中,先r ...
- OC12_自动释放池
// // Dog.h // OC12_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...
- OC11_自动释放池
// // Dog.h // OC11_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...
- OC中对象元素的引用计数 自动释放池的相关概念
OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc] view plaincopy 1. // 2. / ...
- objective-C 的内存管理之-自动释放池(autorelease pool)
如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...
- (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
引用计数 引用计数是c/c++项目中一种古老的内存管理方式.当我8年前在研究一款名叫TCPMP的开源项目的时候,引用计数就已经有了. iOS SDK把这项计数封装到了NSAutoreleasePool ...
随机推荐
- Oracle中SQL语句分类
Oracle中SQL语句分类如下:1.DML语句 insert/delete/update/select/merge/explan plan/lock table2.DDL语句 create/atlt ...
- C++笔记十二:C++对C的扩展——struct关键字类型增强
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型. C++中的struct是一个新类型的定义声明. struct Student { char name[100]; int ...
- Docker标准化开发测试和生产环境
对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资 ...
- proc文件系统探索 之 根目录下的文件[1]
2.1根目录下的文件2.1.1lock文件内核锁,记录与被打开的文件有关的锁信息. 该文件显示当前被内核锁定的文件.该文件包含的内容是内核调试数据,根据使用的系统的这些数据会变化很大.一个/proc/ ...
- 剑指Offer——京东实习笔试题汇总
剑指Offer--京东实习笔试题汇总 编程题1 题目的详细信息已经记不住,只能大致描述一下,就是求最有价值的的委托信息. n.s.B.S其中n代表委托信息,s要求的最有价值的委托信息的个数,B代表买入 ...
- Selenium Webdriver元素定位的八种常用方法
如果你只是想快速实现控件抓取,而不急于了解其原理,可直接看: http://blog.csdn.net/kaka1121/article/details/51878346 如果你想学习web端自动化, ...
- Scikit-learn:模型选择Model selection
http://blog.csdn.net/pipisorry/article/details/52250983 选择合适的estimator 通常机器学习最难的一部分是选择合适的estimator,不 ...
- 保存图片到SD卡
添加SD卡写权限 方法 public void saveMyBitmap(String bitName, Bitmap mBitmap) { File f = new File("/sdca ...
- 仿qq最新侧滑菜单
为了后续对这个项目进行优化,比如透明度动画.背景图的位移动画,以及性能上的优化. 我把这个项目上传到github上面,请大家随时关注. github地址https://github.com/sungu ...
- Unity插件 - MeshEditor(七)变形动画骨骼及蒙皮
MeshAnimation在物体的顶点比较多的情况下,悲剧是显而可见的,我一个一个的点选顶点肯定得累死,而且对于形态的调控不是很方便,应该说是很麻烦,要知道,骨骼动画因为有了骨骼以及蒙皮信息而有了灵魂 ...