0

我在视图控制器之间传输数据时遇到问题。我现在正在开发一个小应用程序,它有一个主视图控制器,在这个视图控制器中,用户可以更改一些全局数据,所有其他视图控制器都将使用这些数据从 Internet 获取数据。因此,当全局数据发生变化时,我需要告诉其他视图控制器更新数据。

问题是当全局数据发生变化时如何告诉其他视图控制器

我知道我应该使用 NSNotificationCenter 来解决这个问题,但我觉得通知对于所有的视图控制器来说就像一个外国人。

我想要做的是添加一个 ViewControllerManager 来管理所有的 viewController。首先,我会将所有需要使用全局数据的视图控制器添加到管理器中。然后,当全局数据发生变化时,我可以通过管理器找到这些视图控制器,并通知它们直接更新全局数据。

这是我的@interface。

@interface ViewControllerManager : NSObject
+ (ViewControllerManager *)sharedManager;
- (void)addViewController: (UIViewController *)viewController;
- (void)removeViewController: (UIViewController *)viewController;
- (void)removeViewControllerByClass: (Class)aClass;

- (UIViewController *)viewControllerByClass: (Class)aClass;
- (NSArray *)viewControllersByClass: (Class)aClass;

//get viewcontrollers who can response to selector, so I can send them this message.
- (NSArray *)viewControllersResponseTo: (SEL) selector;

//get current visible viewcontroller.
@property (nonatomic, retain) UIViewController * visibleViewController;

@end

效果很好,通过这个管理器我可以得到任何我想要的视图控制器,并且我可以在视图控制器之间轻松传输全局数据,但问题是我不知道如何正确管理内存,在方法中 [ViewControllerManager addViewController: ],我保留了视图控制器,但是我不知道什么时候释放它,所以这个viewController永远不会被释放......

4

2 回答 2

1

您可以发布的最新时间点在您的管理器类的 dealloc 方法中。如果您在添加它们时将这些控制器存储在一个数组中,则该数组也会保留它们。仅保留和释放该数组而不是控制器可能是一种解决方案。当从数组中删除一个项目时,数组会进行必要的释放。同样,当数组消失(释放)时,项目也会消失(自动)。

顺便说一句,我认为您正在做的事情称为调解者模式。控制器只与一个中心对象交谈,而不是彼此交谈。只有调解人知道所有的演员。

于 2013-08-01T14:18:31.537 回答
0

最后,我通过弱引用解决了这个问题,代码如下:https ://github.com/github-xiaogang/ViewControllerManager

于 2013-12-09T05:40:53.767 回答