1

例如,假设我有一个RootViewController类和一个AnotherViewController类,并且我需要更改我的RootViewControllerfrom中的一个属性AnotherViewController……在其中有一个“RootViewController”属性是否安全AnotherViewController.h(以便我可以访问它的实例变量)?

@interface AnotherViewController : UIViewController {
    RootViewController *rootViewController;
}

@property (nonatomic, retain) RootViewController *rootViewController;
@end

@implementation AnotherViewController

@synthesize rootViewController;

- (void)someMethod {
    // set the data was added flag, so the rootViewController knows to scroll to the bottom of the tableView to show the new data
    self.rootViewController.dataWasAdded = YES;

    // if the user came in via a search result, make the search controller's tableView go away
    self.rootViewController.searchDisplayController.active = NO;
}

如果这不是一个好主意,有人可以解释为什么吗?

在上面的代码中,我知道我可以使用协议/委托来处理同样的事情——我猜我可能应该这样做。然而,我读过的书籍或其他材料都没有真正讨论过这个问题。

我问的原因是我正在使我的应用程序通用,并且使用UISplitViewController我注意到当用户在“详细视图”中进行更改时,我需要经常更新我的“主视图”。所以,我采取了看似简单的方法并开始设置UIViewControllers为属性......但我遇到了一些难以跟踪的内存泄漏和偶尔的崩溃。我读了一些关于“循环引用”的东西,想知道这是否是问题的一部分(我确实有几个地方UIViewControllers被设置为彼此的属性)。

感谢您提供任何见解或指向涵盖此内容的参考材料。

4

1 回答 1

4

我会避免养成这种习惯,因为有更好的更安全的选择。使用协议/委托是 Apple 跨类管理数据的首选方式。您还可以设置 NSNotifications 以将数据/事件从一个类发送/触发到另一个类。Key Value Observing (KVO) 也是一种很好的监听变化的方式。

在 MVC 结构中,子视图和下游控制器真的不应该知道(也就是保留引用)它们的父视图。它应该始终以相反的方式工作,父母管理和跟踪孩子。

于 2011-06-30T16:05:51.413 回答