解决循环引用的问题,参考学习了ibireme大神的YYFPSLabel的实现,整理以备用

    // 如果直接用 self 或者 weakSelf,都不能解决循环引用问题
_link = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(tick:)];
// _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];
// __weak typeof(self) weakSelf = self;
// _link = [CADisplayLink displayLinkWithTarget:weakSelf selector:@selector(tick:)];
[_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
//NSDefaultRunLoopMode - 标准优先级
//NSRunLoopCommonModes - 高优先级
//UITrackingRunLoopMode - 用于UIScrollView和别的控件的动画
return self;
@interface YYWeakProxy : NSProxy

/**
The proxy target.
*/
@property (nonatomic, weak, readonly) id target; /**
Creates a new weak proxy for target. @param target Target object. @return A new proxy object.
*/
- (instancetype)initWithTarget:(id)target; /**
Creates a new weak proxy for target. @param target Target object. @return A new proxy object.
*/
+ (instancetype)proxyWithTarget:(id)target; @end
@implementation YYWeakProxy

- (instancetype)initWithTarget:(id)target {
_target = target;
return self;
} + (instancetype)proxyWithTarget:(id)target {
return [[YYWeakProxy alloc] initWithTarget:target];
} - (id)forwardingTargetForSelector:(SEL)selector {
return _target;
} - (void)forwardInvocation:(NSInvocation *)invocation {
void *null = NULL;
[invocation setReturnValue:&null];
} - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
return [NSObject instanceMethodSignatureForSelector:@selector(init)];
} - (BOOL)respondsToSelector:(SEL)aSelector {
return [_target respondsToSelector:aSelector];
} - (BOOL)isEqual:(id)object {
return [_target isEqual:object];
} - (NSUInteger)hash {
return [_target hash];
} - (Class)superclass {
return [_target superclass];
} - (Class)class {
return [_target class];
} - (BOOL)isKindOfClass:(Class)aClass {
return [_target isKindOfClass:aClass];
} - (BOOL)isMemberOfClass:(Class)aClass {
return [_target isMemberOfClass:aClass];
} - (BOOL)conformsToProtocol:(Protocol *)aProtocol {
return [_target conformsToProtocol:aProtocol];
} - (BOOL)isProxy {
return YES;
} - (NSString *)description {
return [_target description];
} - (NSString *)debugDescription {
return [_target debugDescription];
} @end

NSProxy( /BrE ˈprɒksi/)的父类不是NSObject

CADisplayLink使用中的循环引用问题的解决的更多相关文章

  1. CADisplayLink、NSTimer循环引用解决方案

    前言:CADisplayLink.NSTimer 循环引用问题 ​ CADisplayLink.NSTimer会对Target产生强引用,如果target又对他们产生强引用,那么就会引发循环引用. @ ...

  2. NSTimer定时器进阶——详细介绍,循环引用分析与解决

    引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...

  3. Unity容器构造函数参数循环引用问题及解决

    关键字: Unity .NET5 .NET6 循环引用 循环依赖 Quartz StdSchedulerFactory 起因 在.NET6/.NET5环境中,使用Unity替换默认容器,用到了Quar ...

  4. ios 中的循环引用问题及解决

    循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存.其实有点类似死锁. 举个例子:A->B->C->....->X->B   - ...

  5. EF 多对多循环引用序列化失败 解决办法

    错误:Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.tbldph_901D48A194FB31 ...

  6. Block的使用及循环引用的解决

    Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closu ...

  7. EF中Json序列化对象时检测到循环引用的解决办法

    MVC4 EF中将数据表外键引用的是自身,转换成Json时,总是提示错误:“序列化类型为....的对象时检测到循环引用.”: 解决办法: 把要序列化的对象转为匿名对象去掉导航属性,如下 :本来是var ...

  8. iOS之weak和strong、懒加载及循环引用

    一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...

  9. 第3月第9天 循环引用 block

    一.一个对象没有被引用,那么在函数块完成时就会被dealloc,这种情况因为对象销毁了,block块也永远不会执行. MyNetworkOperation *op = [[MyNetworkOpera ...

随机推荐

  1. 提高Java代码质量的Eclipse插件之Checkstyle的使用详解

    提高Java代码质量的Eclipse插件之Checkstyle的使用详解 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代 ...

  2. (*p)++ 与 *p++ 与 ++*p 拨开一团迷雾

    (*p)++ 与 *p++ 与 ++*p 拨开一团迷雾 环境:win7 IDE:DEV-C++ 编译器:GCC 1.先说++i和i++的基础 代码如下: ? 1 2 3 4 5 6 7 8 9 10 ...

  3. tastypie Django REST framework

    Its one of the primary authors' lecture on pyCon: http://www.youtube.com/watch?v=Zv26xHYlc8s&nor ...

  4. head first--------------------template method pattern

    head first---------模板方法模式         浅谈谈模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...

  5. linux下编译运行驱动

    linux下编译运行驱动 嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发. 按照如下方 ...

  6. Facebook开源的基于SQL的操作系统检测和监控框架:osquery

    osquery简介 osquery是一款由facebook开源的,面向OSX和Linux的操作系统检测框架. osquery顾名思义,就是query os,允许通过使用SQL的方式来获取操作系统的数据 ...

  7. JSP标签<meta>的作用

    meta标签: meta标签共有两个属性,它们分别是http-equiv属性和name属性. name 属性 :<meta name="Generator" contect= ...

  8. Cordova环境搭建与hello word

    一.环境下载 1.下载并安装Node.js 安装一路下一步即可 2.下载并安装Git 安装一路下一步即可 3.配置Android开发平台环境 (1)下载JDK (2)下载AndroidSDK (3)下 ...

  9. Jmeter之基本介绍

    初学Jmeter,以下是我常用的功能,总结一下. 1.Thread Group线程组 线程组,即:虚拟用户组

  10. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...