nstimer循环引用_ios开发中经典循环引用场景?
1、属性传值循环引用
如:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TabelViewCell *cell = ...
cell.tableView = tableView;
return cell;
}
@interface TableViewCell: UITableViewCell
@property (nonatomic, strong) UITableView *tableView;
@end
cell 添加到tableView上被tanleView强引用,cell中tableView被强引用,造成循环引用;
所以cell中tableView应该用weak关键字
2、delegate属性用strong关键字循环引用
定义:
@interface Class A: NSObject
@property (nonatomic, strong) BView *someView;
@property (nonatomic, strong) XXXDelegate delegate;
调用:
self.someView.delegate = self;
class A强引用BView, BView的代理指向A,因为delegate是strong关键字修饰,所以BView会强引用A的实例,造成循环引用
所以delegate关键字应该用weak修饰
3、block接获变量,循环引用
self.block = ^{
self.someProperty = xxx;
}
self持有block,block截获self(这一点我也没搞太明白),赋值会把block copy到堆上,持有相关变量,就是self持有block,block又持有self,形成循环引用
解决方式:
__weak typeOf(self) weakSelf = self;
self.block = ^{
weakSelf.someProperty = xxx;
}
延展:
但这种方式可能会造成内存提前回收,比如说:block中不是简单的赋值操作,而是一个耗时的网络请求,block中的操作还没有结束,self被释放掉了,这个时候seakSelf为nil,所以someProperty无法赋值
解决方式:
__weak typeOf(self) weakSelf = self;
self.block = ^{
__strong typeOf(self) strongSelf = weakSelf;
strongSelf.someProperty = xxx;
}
原理: block中强引用self,所以self在要被释放时检查到引用计数不为0,所以系统无法释放self实例,只有等待block执行完毕,block内存被释放的时候,才会释放掉self,所以someProperty赋值成功
4、NSTimer循环引用
例如:
class ViewController
@property (nonatomic, strong) NSTimer *timer;
调用:
self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];
这个类似于delegate,把timer的target指向了self,所以可以用weak的方式解除循环引用;
但是在实际的代码使用过程中,timer一般需要加入到runloop中,被runloop强引用,所以timer强引用viewController, runloop强引用timer,ViewController pop后无法释放,具体可以查看这篇博客对NSTimer的分析
所以可以采用另一种方式解决循环引用:
__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelf timerRun];
}];
注意:timer释放前需要invalidate
总结:iOS中常见的循环引用大致有这4种,根据实际的情况分析解决办法
nstimer循环引用_ios开发中经典循环引用场景?相关推荐
- 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现
前言 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现. 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制 ...
- python中一个对象只能被一个变量引用吗_Python中for循环里的变量无法被引用的解决方法...
在之前的编程语言里,学到for循环里面是可以重置变量i的值的,然后让整个for循环从头开始,但是在python里面却行不通这是为什么呢? 在python中,for循环相当于一个迭代器(Iterator ...
- swift 同步 网络请求_IOS开发中异步网络请求上实现同步逻辑
IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI ...
- js中的for循环如何跳出,js中for循环的两种语法
js几种for循环的几种用法 谷歌人工智能写作项目:小发猫 js,for循环是怎么运行的? typescript有哪些变化. 最普遍的介绍:for循环是JavaScript中最常用的循环,标准for循 ...
- smarty 模板 for循环 php,smarty模板中for循环的扩展插件
smarty是php开发中非常流行的一个模板,以前曾发过一篇文章php smarty中文截取插件开发示例是说明如何开发smarty插件的,这篇文章将分享一下如何为smarty模板做一个for循环的扩展 ...
- python循环语句-python语句中Python循环语句(附代码)
python语句多如牛毛,对于很多初学者来说,不知道该如何下手.今天本文将着重讲述python语句中for语句和while语句.都知道这2种语句都属于循环语句,for语句属于遍历循环,while语句属 ...
- python中for循环和while循环的区别_Python中for循环和while循环有什么区别?
for循环和while循环有什么区别?众做周知,循环是Python中最基础也是最常见的知识点之一,下面我们来一起好好学习一下for循环和while循环,并对比分析两者的使用区别,帮助Python初学者 ...
- php中用for循环制作矩形,PHP中for循环语句的几种变型
PHP中for循环语句的几种变型 2021-01-22 10:21:42406 for语句可以说是PHP(同时也是多种语言)的循环控制部份最基本的一个语句了,for语句的执行规律和基础用法在这里就不多 ...
- python中for循环和while循环的区别_Python中for循环语句和while循环语句有何不同
原标题:Python中for循环语句和while循环语句有何不同 前面两期文章已经为大家分别讲解,for循环语句和while循环语句,两种都是化繁琐为简单的Python循环语句,选择困难症已经不知道该 ...
最新文章
- Struts1与Struts2的区别
- 15家大数据公司被调查,数据行业面临大清洗?
- Vim快捷输出查找寄存器的内容(去除\,\和\V)
- java 文件读入 数组,将文本文件读入2d数组java
- 型热电偶阻值温度对照表_如何选用温度传感器
- 转载:中年程序猿的迷茫,你还在深究技术吗?
- 将一个BYTE数组转换成16进制字符串和10进制字符串格式
- ES6 -数组的扩展
- 2015蓝桥杯C++A:手链样式(圆排列和环排列)
- RHEL 6.5 静默安装 oracle 11.2.4
- Java程序连接数据库
- cad填充图案乱理石_cad采矿制图时遇到问题的完美解决方法
- ESRI产品框架和PostgreSQL对比及GIS技术前景
- js replace 中文分号_关于js分号的问题?
- 厦门理工学院OJ题解(1223:Rite与跳舞毯)
- 如何解决win10 软件运行看不见窗口问题
- RocketMQ-顺序消息Demo及实现原理分析
- Rosalind: DNA核苷酸计数和DNA翻译成RNA
- 《离散数学导学》精炼:第4,5章(集合论,布尔代数)
- 基于 qiankun 的微前端实践
热门文章
- Fiori Elements - list report.xml layout and fragment xml load
- Backbone - create model的实现原理
- orgman set触发的pricing set创建逻辑
- Cannot maintain customer-spec. event handler registration in SAP system
- SAPSQL_IN_ITAB_ILLEGAL_OPTION dump
- Buffer table CRMD_DHR_HSRVORD
- copy-maven-plugin - where is it configured - Maven原理探究
- SAP WebIDE的本地安装方式
- 如何处理SAP OData错误消息: Invalid parametertype used at function XXXX
- SAP CRM呼叫中心end按钮的实现逻辑