我的应用程序中有一个封装了通过HTTP与服务器通信的对象。该对象会发送一些HTTP请求以“轮询”服务器是否有变化,例如会话不再有效或者用户有新消息等等。
应用程序的UI对象必须向通信对象注册自己,以通过UI对象实现的协议接收通知。注册是通过类似以下方法完成的:
[communicationObject addObserver: self];
并且将其自身移除:
[communicationObject removeObserver: self];
通信对象将观察者保存在可变数组中。在某些情况下,UI对象是被推入 UINavigationController 中的 UIViewControllers。在这种情况下,当用户返回到父控制器时,由于通信对象的观察者数组保留了它,因此 UI 控制器不会被释放,并且无法通过 dealloc 方法从观察者中删除自己(很明显)。问题是:这种观察者-通知机制是一种糟糕的设计模式吗?有没有一种方法可以检测到 UI 控制器已经被父控制器释放而不使用 viewWillDisappear 方法?有没有最佳实践来解决这种情况?
weak
引用的包装器对象,并将其放入列表中。然后,你可以检测观察者是否已被释放。如果在操作对象时同时释放了对象,可能会有些棘手,因此你需要仔细考虑一下。 - Hot Licks