例如,假设我有一个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
设置为另一个的属性)。
感谢您的任何见解,或指向参考材料,涵盖此。
+1说得好。父控制器保留对其子视图控制器的引用是很好的 - 这里已经存在依赖关系,因为父对象通常必须实例化子对象。但是,如果您可以避免依赖于其他方向,那么子控制器会更独立,更易于重用,并且更易于测试。 – Caleb
感谢您的回复。听起来像我需要重构我的一些代码。我在我的4个子视图控制器中至少使用了17种不同的方法访问父视图控制器,因此需要一些工作 - 但希望能够清除(或帮助我追踪)莫名其妙的内存泄漏。这样做也应该允许我摆脱一些#import指令,我必须将其放入接口头文件(其中@class不起作用)并摆脱潜在的循环依赖关系。 –