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开发中经典循环引用场景?相关推荐

  1. 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现

    前言 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现. 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制 ...

  2. python中一个对象只能被一个变量引用吗_Python中for循环里的变量无法被引用的解决方法...

    在之前的编程语言里,学到for循环里面是可以重置变量i的值的,然后让整个for循环从头开始,但是在python里面却行不通这是为什么呢? 在python中,for循环相当于一个迭代器(Iterator ...

  3. swift 同步 网络请求_IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI ...

  4. js中的for循环如何跳出,js中for循环的两种语法

    js几种for循环的几种用法 谷歌人工智能写作项目:小发猫 js,for循环是怎么运行的? typescript有哪些变化. 最普遍的介绍:for循环是JavaScript中最常用的循环,标准for循 ...

  5. smarty 模板 for循环 php,smarty模板中for循环的扩展插件

    smarty是php开发中非常流行的一个模板,以前曾发过一篇文章php smarty中文截取插件开发示例是说明如何开发smarty插件的,这篇文章将分享一下如何为smarty模板做一个for循环的扩展 ...

  6. python循环语句-python语句中Python循环语句(附代码)

    python语句多如牛毛,对于很多初学者来说,不知道该如何下手.今天本文将着重讲述python语句中for语句和while语句.都知道这2种语句都属于循环语句,for语句属于遍历循环,while语句属 ...

  7. python中for循环和while循环的区别_Python中for循环和while循环有什么区别?

    for循环和while循环有什么区别?众做周知,循环是Python中最基础也是最常见的知识点之一,下面我们来一起好好学习一下for循环和while循环,并对比分析两者的使用区别,帮助Python初学者 ...

  8. php中用for循环制作矩形,PHP中for循环语句的几种变型

    PHP中for循环语句的几种变型 2021-01-22 10:21:42406 for语句可以说是PHP(同时也是多种语言)的循环控制部份最基本的一个语句了,for语句的执行规律和基础用法在这里就不多 ...

  9. python中for循环和while循环的区别_Python中for循环语句和while循环语句有何不同

    原标题:Python中for循环语句和while循环语句有何不同 前面两期文章已经为大家分别讲解,for循环语句和while循环语句,两种都是化繁琐为简单的Python循环语句,选择困难症已经不知道该 ...

最新文章

  1. Struts1与Struts2的区别
  2. 15家大数据公司被调查,数据行业面临大清洗?
  3. Vim快捷输出查找寄存器的内容(去除\,\和\V)
  4. java 文件读入 数组,将文本文件读入2d数组java
  5. 型热电偶阻值温度对照表_如何选用温度传感器
  6. 转载:中年程序猿的迷茫,你还在深究技术吗?
  7. 将一个BYTE数组转换成16进制字符串和10进制字符串格式
  8. ES6 -数组的扩展
  9. 2015蓝桥杯C++A:手链样式(圆排列和环排列)
  10. RHEL 6.5 静默安装 oracle 11.2.4
  11. Java程序连接数据库
  12. cad填充图案乱理石_cad采矿制图时遇到问题的完美解决方法
  13. ESRI产品框架和PostgreSQL对比及GIS技术前景
  14. js replace 中文分号_关于js分号的问题?
  15. 厦门理工学院OJ题解(1223:Rite与跳舞毯)
  16. 如何解决win10 软件运行看不见窗口问题
  17. RocketMQ-顺序消息Demo及实现原理分析
  18. Rosalind: DNA核苷酸计数和DNA翻译成RNA
  19. 《离散数学导学》精炼:第4,5章(集合论,布尔代数)
  20. 基于 qiankun 的微前端实践

热门文章

  1. Fiori Elements - list report.xml layout and fragment xml load
  2. Backbone - create model的实现原理
  3. orgman set触发的pricing set创建逻辑
  4. Cannot maintain customer-spec. event handler registration in SAP system
  5. SAPSQL_IN_ITAB_ILLEGAL_OPTION dump
  6. Buffer table CRMD_DHR_HSRVORD
  7. copy-maven-plugin - where is it configured - Maven原理探究
  8. SAP WebIDE的本地安装方式
  9. 如何处理SAP OData错误消息: Invalid parametertype used at function XXXX
  10. SAP CRM呼叫中心end按钮的实现逻辑