最近在排查项目中存在的内存泄漏,今天和大家分享一个CADisplayLink造成循环引用的解决方案,造成内存循环引用的原因和NSTimer是一样的都是加入runloop后对target进行了一个强持有造成的。具体代码如下:

interface CADisplayLink (JKBasicProvider)+ (CADisplayLink *)jk_displayLinkWithTarget:(id)targetselector:(SEL)selector;+ (CADisplayLink *)jk_displayLinkWithTarget:(id)targetblock:(void(^)(CADisplayLink *displayLink))block;
@end
@interface CADisplayLinkTarget : NSObject@property (nonatomic, weak) id actionTarget;
@property (nonatomic, assign) SEL actionSelector;
@property (nonatomic, copy) void(^actionBlock)(CADisplayLink *displayLink);@end@implementation CADisplayLinkTarget- (instancetype)initWithSelector:(SEL)actionSelector target:(id)actionTarget
{self = [super init];if (self) {self.actionBlock = nil;self.actionTarget = actionTarget;self.actionSelector = actionSelector;}return self;
}- (instancetype)initWithBlock:(void(^)(CADisplayLink *displayLink))actionBlock target:(id)actionTarget
{self = [super init];if (self) {self.actionBlock = actionBlock;self.actionTarget =actionTarget;}return self;
}- (void)displayLinkAction:(CADisplayLink *)displayLink
{if (!self.actionTarget) {[displayLink invalidate];displayLink = nil;} else {if (self.actionBlock) {self.actionBlock(displayLink);}else{IMP imp = [self.actionTarget methodForSelector:self.actionSelector];void (*func)(id, SEL,CADisplayLink *) = (void *)imp;func(self.actionTarget, self.actionSelector,displayLink);}}
}@end@implementation CADisplayLink (JKBasicProvider)+ (CADisplayLink *)jk_displayLinkWithTarget:(id)targetselector:(SEL)selector
{CADisplayLinkTarget *displayLinkTarget = [[CADisplayLinkTarget alloc] initWithSelector:selector target:target];CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:displayLinkTarget selector:@selector(displayLinkAction:)];return displayLink;
}+ (CADisplayLink *)jk_displayLinkWithTarget:(id)targetblock:(void(^)(CADisplayLink *displayLink))block
{CADisplayLinkTarget *displayLinkTarget = [[CADisplayLinkTarget alloc] initWithBlock:block target:target];CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:displayLinkTarget selector:@selector(displayLinkAction:)];return displayLink;
}@end

源码已验证没问题,大家可以直接复制使用。
更多技术干货文章可以扫描下方二维码:

iOS 解决CADisplayLink造成循环引用方案相关推荐

  1. 使用gson解决java对象循环引用问题

    2019独角兽企业重金招聘Python工程师标准>>> 特别说明:gson处理循环引用问题,不会影响java本身的序列化,只影响gson自身的,注意区分. 1. java对象引用成环 ...

  2. java json循环引用_填坑,解决json对象循环引用,在复杂案例中的应用

    // 这是Kotlin代码,Java也是一样原理,都是用@JsonView实现单向透明.// 原理:使用@JsonView和withView(JvXxx) 让jackson从某一方向扫描时,直接忽略某 ...

  3. iOS: NSTimer的循环引用(解决)

    首先有两个概念写在最前: 内存泄漏:系统分配的内存空间在使用完毕之后没有进行及时的回收,称之为发生了内存泄漏. 内存溢出:指在申请内存的时候,没有足够的内存空间可以使用,包括栈溢出和堆溢出. 下面开始 ...

  4. [iOS]-NSTimer与循环引用的理解

    目录: 参考的博客: 问题引入 循环引用 简单的循环引用 Block中的循环引用强弱共舞 Delegate中的循环引用 NSTimer 创建NSTimer 销毁NSTimer invalidate f ...

  5. iOS开发笔记(二):block循环引用

    写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...

  6. 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

    1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...

  7. ios开发 循环引用 检测_iOS开发——Block引起循环引用的解决方案

    [目前总结了一下,在iOS平台容易引起循环引用的几个场景:一.parent-child模式二.block(编译器会提示警告)三.NSTimer] up vote 0 down vote favorit ...

  8. 解决flask循环引用的问题

    刚开始结构是这样的 app - init.py - models.py init.py是这样的 ` from flask import Flask from flask-sqlalchemy impo ...

  9. nstimer循环引用_NSTimer循环引用的几种解决方案

    前言 在iOS中,NSTimer的使用是非常频繁的,但是NSTimer在使用中需要注意,避免循环引用的问题.之前经常这样写: - (void)setupTimer { self.timer= [NST ...

最新文章

  1. opencv函数copyto的用法
  2. 第1课第4.4节_Android硬件访问服务编写HAL代码
  3. 重磅突发!全球首富40颗卫星遭摧毁
  4. 用半机械器官,打开发育生物学领域的黑匣子
  5. Mac下使用svn命令
  6. 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
  7. python学习-类(global、nonlocal、继承、多态)
  8. 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
  9. python csv 排序_python数据清洗
  10. Java NIO学习篇之StandardOpenOption详解
  11. 湖南计算机对口专科学校,湖南计算机专业对口升学有哪些学校?
  12. JAVA中RGB字串转换为颜色
  13. 林子雨_大数据技术原理与应用课后习题
  14. 变速精灵试用 目前唯一支持Vista加速
  15. UVa 11991 - Easy Problem from Rujia Liu?
  16. 二进制炸弹——拆弹实验
  17. mybatis mybatis的resultType详解
  18. 14期《掬水月在手,弄花香满衣》1月刊
  19. 贪婪洞窟2服务器维护,贪婪洞窟211月30日更新维护公告 贪婪洞窟211月30日更新了那些内容...
  20. 阿米洛键盘失灵_改变静电容键盘手感单一限制,阿米洛静电容机械轴V2上手

热门文章

  1. xp计算机安全设置在哪里,WinXP如何进入安全模式?WinXP进入安全模式设置
  2. 51CTO高阳访谈直播全文播放
  3. EagleGet - 猎鹰,视频下载的神器
  4. 基于webrtc的视频聊天室(五)之服务端设计
  5. lungs UFA eat walnuts.
  6. 电脑误删除文件怎么恢复文件,不小心删除了电脑的文件怎么办
  7. Kotlin学习之json数据解析
  8. 图解计算机结构与体系分类!!
  9. 涂鸦蓝牙SDK开发系列教程——2.产品创建
  10. 自建CDN防御DDoS(2):架构设计、成本与部署细节