(五十八)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 ...
随机推荐
- Fiddler实现对手机抓包
工具 && 前提条件: 1. 安装了Fiddler的PC一台 2. 手机一部 3. 手机和PC是在同一个局域网内,或者至少能够联通,即手机的流量能够转发到PC端上能够被其捕获 PC端 ...
- Java 求n天前的时间或者n月前的时间
时间格式化 public static String DEFAULT_FORMATDATE = "yyyy-MM-dd"; 1.n天前的日期 /** * luyanlong * 默 ...
- iOS objc_msgSend 野指针Crash 从 Log 提取 Crash 时 selector 的地址和名字并打印
从 crash stack log 里面,提取 objc_msgSend 关键字,定位是否是野指针问题导致的crash,如果是则打印 crash 时的 objc_msgSend 调用的第二个参数,即 ...
- 简单将sublime text 配置为lua或c#一键编译运行环境
lua { "cmd": "luajit $file", "selector":"source.lua" } C { & ...
- Servlet再度学习
虽然Servlet已经使用很多了,但是一直都仅局限在其使用操作上. 最近有空想对它进行一个相对全面的了解. 下面是博主整理的一篇博文. 一.Servlet简介 Servlet(Server Apple ...
- DOS界面下的翻译软件制作
准备 素材 依赖 接口 地址 参数 返回值解析 编码及测试 功能代码 运行脚本 环境变量 结果展示 英语转汉语 汉语转英语 总结 昨天看到一篇关于Linux下的桌面词典的文章,于是就想实现一个Wind ...
- 探究java接口中的变量与方法
关于变量 java接口里的变量都是默认 pubic static final的 为啥? public 接口得能被所有对象调用 static 这个变量是属于接口本身,而不是实现了接口的对象的 具体来说 ...
- 1CCTableView的使用,TableView响应和小格子tableView实现
1 CCTableView的使用 T26TableView.h #ifndef __T26TableView_H__ #define __T26TableView_H__ #includ ...
- Spring开发环境搭建教程
Spring开发环境搭建 JDK7以上版本 eclispe for j2ee 4.0以上版本 Spring frameWorks 3.0以上版本 至于前两个我们就不介绍,直接百度就可以了,对于Spri ...
- 1.2、Android Studio为新设备创建一个模块
模块为你的应用的源码.资源文件和app level设置(比如AndroidManifest.xml)提供了一个容器.每个模块可以独立的构建.测试和调试. 通过使用模块,Android Studio可以 ...