(五十八)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 ...
随机推荐
- 使用ffmpeg转码时遇到aac报错
今天尝试用ffmpeg转一个视频的格式,结果报出这个错误: The encoder 'aac' is experimental but experimental codecs are not enab ...
- 用tensorflow迁移学习猫狗分类
笔者这几天在跟着莫烦学习TensorFlow,正好到迁移学习(至于什么是迁移学习,看这篇),莫烦老师做的是预测猫和老虎尺寸大小的学习.作为一个有为的学生,笔者当然不能再预测猫啊狗啊的大小啦,正好之前正 ...
- 初始化openresty开发环境
参考链接 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 初始化git ...
- 20160220.CCPP体系详解(0030天)
程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h ...
- Scikit-learn:分类classification
http://blog.csdn.net/pipisorry/article/details/53034340 支持向量机SVM分类 svm分类有多种不同的算法.SVM是非常流行的机器学习算法,主要用 ...
- springMVC源码分析--AbstractHandlerMethodMapping注册url和HandlerMethod对应关系(十一)
在上一篇博客springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)中我们简单地介绍了获取url和HandlerMet ...
- [nginx] 对UA为空的请求返回403
nginx blocking blank user agent . sometime apps' backgroud request always visit a url, and these req ...
- Android 在 SElinux下 如何获得对一个内核节点的访问权限
点击打开链接 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的 ...
- UNIX网络编程——原始套接字的魔力【下】
可以接收链路层MAC帧的原始套接字 前面我们介绍过了通过原始套接字socket(AF_INET, SOCK_RAW, protocol)我们可以直接实现自行构造整个IP报文,然后对其收发.提醒一点,在 ...
- Android开发学习之路--UI之自定义布局和控件
新的一年已经开始了,今天已经是初二了,两天没有学习了,还是要来继续学习下.一般手机的title都是actionbar,就像iphone一样可以后退,可以编辑.这里自定义布局就来实现下这个功能,首先准备 ...