我找到解决NSNotificationCenter通知中心自管理内存的方案了

我找到解决NSNotificationCenter通知中心自管理内存的方案了

我们知道OC中 使用观察者模式 会对观察者进行强引用,导致循环引用,内存无法释放,也就是对象无法走到dealloc这一步。

那么如何实现一个可以自己管理自己生命周期的的通知中心呢?

要解决这个问题,就需要做到两步:1. 拿到观察者数组 2. 找到一个合适的时机对Observer进行释放。

我想了几天,找到了一个思路,这还是前几天领悟适配器模式后带来的启发。我们知道通知中心是通过维护一个观察者数组来进行广播的,如果要解决通知中心自己释放观察者的行为。我们就需要拿到通知中心管理的观察者数组。可是我查了一下NSNotificationCenter的API,苹果并没有对外暴露可以拿到观察者数组的接口。这个时候有用到适配器模式了,其实想来,对原生类的所有扩展方法,适配器模式都是一个很好的方案,这个方案具有最通用的迁移性。我们可以新建一个类,对NSNotificationCenter进行管理,每次添加观察者的时候addObserver就同时将对象也保持在新类中一个管理数组中,而这个数组使我们可以拿到的。

至于释放时机,其实对于Controller来说还是很好找到的,虽然因为循环引用导致代码不能执行到Dealloc方法,但是页面的退出是不受影响的,所以viewDidDisappear是会执行到的。那么这里就是一个很好的释放时机。为了减少依赖,减少侵入性。最好是以面向切面的方式找到这个释放时机,进行释放。所以可以使用BaseController也可以使用runtime的方法交换的方式,找到viewDidDisappear方法。

至此一个完整的解决方案就出来了,通过适配器模式+面向切面编程解决。

发表评论

电子邮件地址不会被公开。 必填项已用*标注