iOS 解决NSTimer循环引用的几种方案

在ViewController2中初始化timer并将ViewController2作为timer的target执行事件,由于两者之间存在互相引用导致不能正常释放

一 在合适的时机释放timer

-(void)didMoveToParentViewController:(UIViewController*)parent 这句代码就是用来管理子视图生命周期的,当当前视图从父视图移除的时候,就释放timer的时机,就能让ViewController2的生命周期回归到一个正常的流程.

二 通过中间者解决

如图通过runtime给target对象添加run方法,然后让timer引用target,最后在析构函数dealloc里释放timer.

三  NSProxy消息转发

和上面的方法类似也是通过中间者的方法来解决,创建一个继承NSProxy的类并声明一个属性target

实现该类的两个方法,1.获取方法签名 2.将消息转发到属性target.

初始化proxy设置target属性为当前控制器,并将proxy设置为timer的target,timer和self不再存在互相引用的问题.

四 改变初始化方法

苹果提供了NSTimer的一种block的初始化方法,如此我们只需要解决block循环引用的问题就能正常释放timer.

但是这种方法只能在ios10.0以后才能使用.不过我们可以通过分类自定义一个类似的初始化方法.

将block作为timer的参数传递到事件中并执行回调

如此不受系统等级限制也能使用block的初始化方法.

你可能感兴趣的:(iOS 解决NSTimer循环引用的几种方案)