ios NSTimer的强引用问题
在一个controller中,使用
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
}];
网络方法请求网络内容,如果在block中,使用了self,或者仅仅使用了类的成员变量,那么这个controller对象就不会被释放!
比如下面的例子:
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[NSTimer scheduledTimerWithTimeInterval:2.0 target:[UIApplication sharedApplication].delegate selector:@selector(test:) userInfo:self repeats:NO ];
}); }];
系统把userInfo这个参数做了强引用。
另外如果仅仅这样写,是不会调用timer的
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"");
[NSTimer scheduledTimerWithTimeInterval:4.0 target:[UIApplication sharedApplication].delegate selector:@selector(test:) userInfo:self repeats:NO];
}];
因为这是个子线程,而它没有runloop run 进行消息循环,所以当函数结束,线程就结束,就没机会调用timer中的函数了。
也可以用下面这种技巧进行延时调用
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"");
[NSTimer scheduledTimerWithTimeInterval:4.0 target:[UIApplication sharedApplication].delegate selector:@selector(test:) userInfo:self repeats:NO];
[[NSRunLoop currentRunLoop] run];
}];
由于这里的repeat是NO,这个timer结束后,整个runloop就没有事件源了,[[NSRunLoop currentRunLoop] run];函数就会立即返回,继续向下执行!
ios NSTimer的强引用问题的更多相关文章
- IOS block 对象强引用和若引用
1. 在block外面这样:__weak MyController *weakSelf = self 或者 __weak __typeof(self) weakSelf = self;是为了防止强引用 ...
- ios - NSTimer中target的self是强引用问题
当控制器ViewController跳转进入控制器OneViewController中的时候开启定时器,让定时器每隔一段时间打印一次,当OneViewController dismiss的时候,控制器 ...
- iOS开发系列-定时器强引用问题
概述 iOS开发中常用的定时器NSTimer.CADisplayLink. NSTimer 和 CADisplayLink 基本使用 NSTimer的创建方法有两个scheduledTimerWith ...
- iOS开发 .framework的Optional(弱引用)和Required(强引用)区别, 有错误 Library not found………………
http://www.cnblogs.com/wanyakun/p/3494323.html 强引用(Required)的framework是一定会被加载到内存的,但是弱引用(Optional)的fr ...
- iOS开发 .framework的Optional(弱引用)和Required(强引用)区别
首先,参考文档:https://blog.stackmob.com/2013/03/objective-c-tip-of-the-month-optional-frameworks/ 强引用(Requ ...
- QF——关于iOS的强引用,弱引用及strong,retain,copy,weak,assignd的关系
强引用和弱引用: 我们已经知道OC中的内存管理是通过“引用计数器”来实现的.一个对象的生命周期取决于它是否还被其他对象引用(是否retainCount=0).但在有些情况下,我们并不希望对象的销毁时间 ...
- iOS强引用和弱引用
保留一个对象创建了一个对该对象的“强”引用.一个对象只有在它的所有强引用都被释放后才能被回收.因此,一个对象的生命周期取决于其强引用的所有者.在某些情况下,这种行为可能并不理想.您可能想要引用一个对象 ...
- 【原】iOS容易造成循环引用的三种场景,就在你我身边!
ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...
- iOS容易造成循环引用的三种场景
iOS容易造成循环引用的三种场景 ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是--循环引用.循环引用可以简单理解为 ...
随机推荐
- 【剑指offer】Java版代码(完整版)
原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...
- HTTP 响应类型 ContentType 对照表
Ø 前言 1. 下面是 HTTP 响应类型 ContentType 的可选值,有备无患先保存一下.摘自:https://wiki.selfhtml.org/wiki/MIME-Type/%C3% ...
- linux修改主机名,关闭图形化界面,绑定ip地址,修改ip地址
1关闭图形化界面 vi /etc/inittab 改成id:3:initdefault: 注意:不要选0或6 2.修改主机名 vi /etc/sysconfig/network 修改即可 3,修改ip ...
- PDO和MySQLi区别与选择?
当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi.在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解.本文就针对他们的不同点进行分析 ...
- 【bzoj 2588】Spoj 10628. Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- 机器学习等知识--- map/reduce, python 读json数据。。。
map/ reduce 了解: 简单介绍map/reduce 模式: http://www.csdn.net/article/2013-01-07/2813477-confused-about-map ...
- Docker 获取镜像 - 一
docker images docker 镜像获取方式: 1.pull 可以直接从网上拉取: 2.import 可以从现有容器打包成一个镜像: 3.commit 可以从现有容器一个镜像: 4.bu ...
- ELK平台搭建(下)
1. 目的 为指导在Centos6.8系统下搭建标准ELK平台的工作,特编写本施工文档. 2. 定义 Elasticsearch Logstash Kibana结合Redis协同工作. 3. 适用范围 ...
- linux时间戳和时间格式的转化
1.将时间戳转化为yyyy-MM-dd HH:mm:ss时间格式 date -d @时间戳(秒) 2.设置服务器时间---特别注意使用 date -s 时间
- Jmeter+Ant+Jenkins 接口自动化之简单demo
之前的文章我们已经分享过了 Jmeter+Ant 的批量执行 ,并且搭建好了Jenkins部署平台,如何再将三者完美结合呢? 1.首先打开Jenkins主页面,进入“系统管理-插件管理”,安装相关的插 ...