【发布时间】:2012-12-23 22:59:20
【问题描述】:
在我的应用程序中,我有一个对象,它封装了通过 HTTP 与服务器的通信。 如果服务器上发生更改,例如会话不再有效,或者有新消息给用户等,此对象会发出一些 HTTP 请求以“轮询”。
应用程序的 UI 对象必须将自己注册到通信对象才能通过 UI 对象实现的协议接收通知。注册是通过如下方法完成的:
[communicationObject addObserver: self];
并删除自身:
[communicationObject removeObserver: self];
通信对象将观察者存储在一个可变数组中。在某些情况下,UI 对象是在 UINavigationController 中推送的 UIViewController。在那种情况下,当用户回到父控制器时,UI控制器并没有被释放,因为通信对象的观察者数组保留了它,并且UI控制器不能将自己从观察者中移除,因为dealloc 方法永远不会被调用(显然)。
问题:这个观察者通知器是一个糟糕的设计模式?有没有不使用viewWillDisappear方法检测到UI控制器被父控制器释放的方法?有解决此类情况的最佳做法吗?
【问题讨论】:
-
我忘记指定内存管理是由 ARC 完成的
-
基本上听起来不错。虽然我从未尝试过,但您应该能够创建一个包装器对象,其中包含对您的观察者对象的
weak引用,并将其放在您的列表中。然后您可以检测观察者是否已被释放。但是,如果一个对象在您对其进行操作时同时被释放,这可能会有点棘手,因此您需要仔细考虑一下。
标签: ios objective-c design-patterns