在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的初始化方法.