iOS使用CADisplayLink、NSTimer有什么注意点?

CADisplayLink、NSTimer会造成循环引用,可以使用YYWeakProxy,或者为CADisplayLink、NStimer添加Block方法来解决循环引用。

  • 使用在传入self时,方法会对self进行强引用。使用YYWeakProxy是为了解决强引用的问题。

问题
因为一般NSTimer的invalidate方法是放在了dealloc方法中执行,而RunLoop已经强引用了NSTimer,所以当界面已经被销毁时,此时self被NSTimer强引用,NSTimer被RunLoop引用,所以不会执行dealloc方法。
因为不执行dealloc方法,导致invalidate不会被执行,此时self就会内存泄露了。


解决
使用了YYWeakProxy后,当界面被销毁时,因为NSTimer没有引用self,而是引用了YYWeakProxy。所以可以执行dealloc方法。


  1. NSProxy本身是一个抽象类,它遵循NSObject协议,提供了消息转发的通用接口,NSProxy通常用来实现消息转发机制和惰性初始化资源。不能直接使用NSProxy。需要创建NSProxy的子类,并实现init以及消息转发的相关方法,才可以用。

  2. YYWeakProxy继承了NSProxy,定义了一个弱引用的target对象,通过重写消息转发等关键方法,让target对象去处理接收到的消息。在整个引用链中,Controller对象强引用NSTimer/CADisplayLink对象,NSTimer/CADisplayLink对象强引用YYWeakProxy对象,而YYWeakProxy对象弱引用Controller对象,所以在YYWeakProxy对象的作用下,Controller对象和NSTimer/CADisplayLink对象之间并没有相互持有,完美解决循环引用的问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容