视图控制器之间的通信

问题描述:

给定具有UINavigationController和2个级别的UITableViews的应用程序部分(即在根控制器上选择一行,将第二个控制器推到导航堆栈上),我有以下问题:视图控制器之间的通信

1)两个控制器都需要一个用户对象。两个控制器之间进行通信的最佳方式是什么?我看到的此站点,其中提到扶养注射和根控制器可以由用户对象传递给所述第二电平控制器的柱:

@implementation SecondLevelViewController 

-(void) initWithUser: (User *) user { 
    // myUser is an instance variable 
    myUser = user; 
    [myUser retain]; 
} 

在该示例中所述第二控制器将似乎保留用户而在这种情况下(松散耦合),我已经看到其他资源(例如斯坦福iPhone开发课程),它鼓吹用户被简单地分配,而不保留。

我也看到了一个委托形式的参数,在第二个控制器(而不是上面的保留的User实例变量)上使用分配的id对象。

如果有人能够为我澄清这一立场,我感到非常困惑,因为这个领域看似矛盾的建议让我感到非常困惑。视图控制器之间进行通信的最佳方式是什么?

2)我的第二个问题也涉及到控制器的结构。我已经看到了一些例子,其中根控制器(在上面的安排中)有一个实例化的二级控制器阵列。在专业应用程序中这是正常的还是会对以这种方式做事情有显着的记忆影响(即没有延迟加载)?我认为阵列的优点是减少二级控制器的加载时间?

谢谢你的回应,因为我正在试图正确地开发事物,而不是将它们拼凑在一起。

1)“视图控制器之间通信的最佳方式是什么?”

没有人“最好”的方式。您可以在初始化时将模型对象传递给视图控制器。在这种情况下,控制器通常应该保留模型。如果您正在编写一个关注可重用性的通用视图控制器类(如UITableViewController),那么使用委托进行是一个很好的选择。

2)“我看到例子,其中根控制器(在上述结构形式中)具有实例化的第二电平的控制器的阵列,这是正常的专业应用”

首先,你应该限制自己的帖子所以每个帖子有一个问题。视图控制器本身的内存影响通常很低。它的实例变量只需要几百字节。内存密集的部分是视图本身。并且UIViewController的视图加载/卸载机制将在需要时注意卸载内存密集型视图(即,如果它收到内存警告并且视图当前不在屏幕上)。所以只要你正确执行viewDidLoadviewDidUnloaddidReceiveMemoryWarning,我不会过多担心视图控制器数组的内存消耗。

UITabBarController也包含一个子控制器数组,所以没有任何问题。但是,您应该避免的是,一个控制器需要保存整个子控制器层次结构(即不仅是二级,而且还包括三级等):不是因为内存问题,而是为了避免不必要的耦合。

+0

感谢您的回答Ole和我注意到您对每个问题的一篇文章的评论。然而,我只是好奇,如果数组方法(在我的第二个问题中提到)确实有任何加载速度优势,或者它只是一个有用的方法来构造您的代码? – Urizen 2009-12-10 12:33:57

+0

实例化一个视图控制器对象不应该花费大量的时间,所以我会说任何加载速度优势都是微不足道的。需要花费时间的是加载视图,但数组方法不会改变视图控制器无论如何都会延迟加载视图的事实。 – 2009-12-10 12:59:18

+0

再次感谢您。非常有用的答案。 – Urizen 2009-12-10 13:35:45

通常你应该尽量避免直接在控制器之间传递数据。

您可以设置每个控制器有权访问的模型,然后可以实施通知以通知其他控制器发生了某些事情。另一个控制器可以从模型中获取所需的任何数据。

这样你可以保持你的控制器分离。