2011-06-30 53 views
1

例如,假设我有一个RootViewController类和AnotherViewController类,并且需要更改我的RootViewController中的属性AnotherViewController ...可以安全地在AnotherViewController.h中有一个“RootViewController”属性(以便我可以访问其实例变量)?将UIViewController设置为另一个UIViewController的属性是不是一个好主意?

@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

我会避免养成这种习惯,因为有更好的安全替代品。使用协议/委托是跨类管理数据的首选Apple方式。您还可以设置NSNotifications来将数据/事件从一个类发送/触发到另一个类。关键价值观察(KVO)也是一种体面的方式来倾听变化。

在MVC构造中,子视图和下游控制器实际上应该不知道(也就是保留引用)父母。它应该总是在父母管理和跟踪孩子的地方工作。

+1

+1说得好。父控制器保留对其子视图控制器的引用是很好的 - 这里已经存在依赖关系,因为父对象通常必须实例化子对象。但是,如果您可以避免依赖于其他方向,那么子控制器会更独立,更易于重用,并且更易于测试。 – Caleb

+0

感谢您的回复。听起来像我需要重构我的一些代码。我在我的4个子视图控制器中至少使用了17种不同的方法访问父视图控制器,因此需要一些工作 - 但希望能够清除(或帮助我追踪)莫名其妙的内存泄漏。这样做也应该允许我摆脱一些#import指令,我必须将其放入接口头文件(其中@class不起作用)并摆脱潜在的循环依赖关系。 –

相关问题