2008-12-03 14 views
58

我期望能够通过我的应用程序中的任何位置引用某些状态/对象。例如,用户登录到他们的应用程序,我需要调用Web服务并检索用户信息。然后,我希望能够从任何地方访问这些信息在应用程序中的东西,如以下:iPhone正确使用应用程序代理

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
user = delegate.u; 

是设置一个实例变量作为应用程序委托User对象,并从那里引用它需要一个穷的时候它的方式吗?我通常在用户登录时设置它。

希望听到专业人士如何处理这一个。

回答

52

通常情况下,你应该只事物联系在一起,如果他们的应用程序的委托:

  • 均来自同一NIB文件作为应用程序委托创建(在单一窗口界面即静态的UI元素)
  • 关联与通过应用程序代理的应用程序级事件处理(如首选项窗口的菜单项)

对于其他任何事情,您应该创建一个管理对它们的访问的单例。

Jason Coco建议通过应用程序控制器进行路由。在我的程序中,我通常会避免这种情况,因为我认为它将过高的责任置于顶层 - 我认为事情应该尽可能地自行管理,并且只有在需要协调同行之间的情况时才能使用高层管理,级模块。

我不会链接自己的博客,但如果你谷歌我和单身你可能会发现我写了一篇文章进入更多的细节。

13

我没有看到您的方法有任何问题。我通常使用一个单来处理这种情况:

// MyCommon.h: 
@interface MyCommon 
class MyCommon : NSObject 
{ 
    int user; 
}; 

@property(assign) int user; 

+ (MyCommon *)singleton; 

@end 

// MyCommon.m: 
@implementation MyCommon 

static MyCommon * MyCommon_Singleton = nil; 

+ (MyCommon *)singleton 
{ 
    if (nil == MyCommon_Singleton) 
    { 
     MyCommon_Singleton = [[MyCommon_Singleton alloc] init]; 
    } 

    return MyCommon_Singleton; 
} 
@end

在我的应用程序的MyCommon单,然后使用任何地方如下:

int user = [MyCommon singleton].user;
+1

我在几年前发布了这篇文章,从那以后我学到了一些东西。单身人士认识的重要事情是,他们与全球变数没有区别。这并不一定意味着它们在所有情况下都应该避免,它只是意味着它们具有相同的缺点,尤其是在适当的封装和易于测试的情况下。例如,在这种情况下,在没有首先设置全局“用户”值的情况下,单独测试依赖于[MyCommon singleton]的单独类是非常困难的。 – 2010-04-19 00:22:43

+0

全局可访问的单例的一个很好的替代方法是使用依赖注入。实质上,在您的应用程序委托中创建相同的“MyCommon”对象,然后将其传递给需要它的任何子对象,然后将此过程继续到对象层次结构的下方。这样一来就增加了一点工作量,但它产生了更易于维护和调试的面向对象的程序。 – 2010-04-19 00:27:52

+0

要了解SO社区对此问题的看法,下面是我在开始制作开关时询问有关单身人士的问题的链接:http://stackoverflow.com/questions/474613 – 2010-04-19 00:33:49

3

通常你会问你的应用程序的控制器此信息,它会负责知道如何存储它/在任何数据模型中查找它。您的应用程序的控制器可能与应用程序委托相同或不同(在大多数简单应用程序中,它是相同的)。

相关问题