模拟一个图片下载的场景,图片的下载需要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实现多线程、自动释放池的补充的更多相关文章

  1. 刀哥多线程自动释放池autoreleasepool

    自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...

  2. 04-OC属性的使用、自动释放池、封装和继承

    目录: 一.IOS6声明式属性的使用 二.autoreleasepool自动释放池 三.封装.继承 回到顶部 一.IOS6声明式属性的使用 注:声明式属性默认情况下,并没有解决内存问题, 当使用@pr ...

  3. OC_内存管理(二)对象复制、循环引用问题、自动释放池

      循环调用: 1.循环引用的问题 两个对象A.B,有可能会出现特殊情况:A中包含B的实例变量:B中也包含A的实例变量,如果这两个实例变量都是强引用(A有着B的实例变量所有权,B也有A的实例变量所有权 ...

  4. OC之property和自动释放池

    property实例 property参数 自动释放池 一.property实例 1.前边的例子我们看到,我们在一个类中如果用到另外一个类的实例作为自己的成员变量时,通常需要在setter方法中,先r ...

  5. OC12_自动释放池

    // // Dog.h // OC12_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  6. OC11_自动释放池

    // // Dog.h // OC11_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  7. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  8. objective-C 的内存管理之-自动释放池(autorelease pool)

    如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...

  9. (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)

    引用计数 引用计数是c/c++项目中一种古老的内存管理方式.当我8年前在研究一款名叫TCPMP的开源项目的时候,引用计数就已经有了. iOS SDK把这项计数封装到了NSAutoreleasePool ...

随机推荐

  1. 预习视频day1

    课前预习 编译型和解释型语言优缺点 python2,pyhon3的宏观(大环境下)区别 python的种类 python编码规则 变量命名规范,常量 注释 1.编译型语言:将源码一次性转化为二进制代码 ...

  2. MongoDB 自动增长

    MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识. 但在某些情况下,我们可能需要实现 ObjectId 自动增长功能. 由于 Mon ...

  3. PHP 5 Calendar 函数

    PHP Calendar 简介 日历扩展包含了简化不同日历格式间的转换的函数. 它是基于 Julian Day Count(儒略日计数),是从公元前 4713 年 1 月 1 日开始计算的. 注释:如 ...

  4. 防止SpringMVC拦截器拦截js等静态资源文件

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静 ...

  5. Android基于JsBridge封装的高效带加载进度的WebView

    Tamic http://blog.csdn.net/sk719887916/article/details/52402470 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBrid ...

  6. ubuntu cpu频率控制

    安装cpufrequtils:  sudo apt-get install cpufrequtils 查看cpu:                 sudo cpufreq-info 设置cpu模式: ...

  7. 多线程并发之java内存模型JMM

    多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...

  8. EJB_开发消息驱动bean

    开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API ...

  9. CSDN发表文章后老是待审核的原因

    最近开始在csdn上写文章,发现老是文章被 待审核 ,于是便在网上搜集了下网友们的反馈,最后做出以下的整理. 1.CSDN检测到文章中的链接大于5,就会将文章列为"待审核",这个其 ...

  10. [ExtJS5学习笔记]第三十二节 sencha extjs 5与struts2的ajax交互配置

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/43487751 本文作者:sushengmiyan ------------------ ...