模拟一个图片下载的场景,图片的下载需要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. 使用ffmpeg转码时遇到aac报错

    今天尝试用ffmpeg转一个视频的格式,结果报出这个错误: The encoder 'aac' is experimental but experimental codecs are not enab ...

  2. 用tensorflow迁移学习猫狗分类

    笔者这几天在跟着莫烦学习TensorFlow,正好到迁移学习(至于什么是迁移学习,看这篇),莫烦老师做的是预测猫和老虎尺寸大小的学习.作为一个有为的学生,笔者当然不能再预测猫啊狗啊的大小啦,正好之前正 ...

  3. 初始化openresty开发环境

    参考链接 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 初始化git ...

  4. 20160220.CCPP体系详解(0030天)

    程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h ...

  5. Scikit-learn:分类classification

    http://blog.csdn.net/pipisorry/article/details/53034340 支持向量机SVM分类 svm分类有多种不同的算法.SVM是非常流行的机器学习算法,主要用 ...

  6. springMVC源码分析--AbstractHandlerMethodMapping注册url和HandlerMethod对应关系(十一)

    在上一篇博客springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)中我们简单地介绍了获取url和HandlerMet ...

  7. [nginx] 对UA为空的请求返回403

    nginx blocking blank user agent . sometime apps' backgroud request always visit a url, and these req ...

  8. Android 在 SElinux下 如何获得对一个内核节点的访问权限

    点击打开链接 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的 ...

  9. UNIX网络编程——原始套接字的魔力【下】

    可以接收链路层MAC帧的原始套接字 前面我们介绍过了通过原始套接字socket(AF_INET, SOCK_RAW, protocol)我们可以直接实现自行构造整个IP报文,然后对其收发.提醒一点,在 ...

  10. Android开发学习之路--UI之自定义布局和控件

    新的一年已经开始了,今天已经是初二了,两天没有学习了,还是要来继续学习下.一般手机的title都是actionbar,就像iphone一样可以后退,可以编辑.这里自定义布局就来实现下这个功能,首先准备 ...