iOS 解决CADisplayLink造成循环引用方案
最近在排查项目中存在的内存泄漏,今天和大家分享一个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造成循环引用方案相关推荐
- 使用gson解决java对象循环引用问题
2019独角兽企业重金招聘Python工程师标准>>> 特别说明:gson处理循环引用问题,不会影响java本身的序列化,只影响gson自身的,注意区分. 1. java对象引用成环 ...
- java json循环引用_填坑,解决json对象循环引用,在复杂案例中的应用
// 这是Kotlin代码,Java也是一样原理,都是用@JsonView实现单向透明.// 原理:使用@JsonView和withView(JvXxx) 让jackson从某一方向扫描时,直接忽略某 ...
- iOS: NSTimer的循环引用(解决)
首先有两个概念写在最前: 内存泄漏:系统分配的内存空间在使用完毕之后没有进行及时的回收,称之为发生了内存泄漏. 内存溢出:指在申请内存的时候,没有足够的内存空间可以使用,包括栈溢出和堆溢出. 下面开始 ...
- [iOS]-NSTimer与循环引用的理解
目录: 参考的博客: 问题引入 循环引用 简单的循环引用 Block中的循环引用强弱共舞 Delegate中的循环引用 NSTimer 创建NSTimer 销毁NSTimer invalidate f ...
- iOS开发笔记(二):block循环引用
写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...
- 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json
1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...
- ios开发 循环引用 检测_iOS开发——Block引起循环引用的解决方案
[目前总结了一下,在iOS平台容易引起循环引用的几个场景:一.parent-child模式二.block(编译器会提示警告)三.NSTimer] up vote 0 down vote favorit ...
- 解决flask循环引用的问题
刚开始结构是这样的 app - init.py - models.py init.py是这样的 ` from flask import Flask from flask-sqlalchemy impo ...
- nstimer循环引用_NSTimer循环引用的几种解决方案
前言 在iOS中,NSTimer的使用是非常频繁的,但是NSTimer在使用中需要注意,避免循环引用的问题.之前经常这样写: - (void)setupTimer { self.timer= [NST ...
最新文章
- opencv函数copyto的用法
- 第1课第4.4节_Android硬件访问服务编写HAL代码
- 重磅突发!全球首富40颗卫星遭摧毁
- 用半机械器官,打开发育生物学领域的黑匣子
- Mac下使用svn命令
- 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
- python学习-类(global、nonlocal、继承、多态)
- 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
- python csv 排序_python数据清洗
- Java NIO学习篇之StandardOpenOption详解
- 湖南计算机对口专科学校,湖南计算机专业对口升学有哪些学校?
- JAVA中RGB字串转换为颜色
- 林子雨_大数据技术原理与应用课后习题
- 变速精灵试用 目前唯一支持Vista加速
- UVa 11991 - Easy Problem from Rujia Liu?
- 二进制炸弹——拆弹实验
- mybatis mybatis的resultType详解
- 14期《掬水月在手,弄花香满衣》1月刊
- 贪婪洞窟2服务器维护,贪婪洞窟211月30日更新维护公告 贪婪洞窟211月30日更新了那些内容...
- 阿米洛键盘失灵_改变静电容键盘手感单一限制,阿米洛静电容机械轴V2上手