iPhone正确使用Application Delegate

时间:2008-12-03 21:17:56

标签: iphone objective-c cocoa-touch

我希望能够通过我的应用程序中的任何位置引用某些状态/对象。例如,用户登录到他们的应用程序,我需要调用Web服务并检索用户信息。然后,我希望能够从应用程序的任何位置访问此信息,如下所示:

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

在app delegate中设置一个实例变量作为User对象,并在需要时从那里引用它是一种糟糕的方式吗?我通常在用户登录时将其设置在那里。

想听听专业人士如何处理这个。

4 个答案:

答案 0 :(得分:52)

通常情况下,您应该只在以下情况下将内容连接到应用代理:

  • 是从与应用委托相同的NIB文件创建的(即单窗口界面中的静态UI元素)
  • 与通过应用程序委托的应用程序级事件处理相关联(如“首选项”窗口的菜单项)

对于其他所有内容,您应该创建一个管理对它们的访问权限的单例。

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

我不会链接我自己的博客,但如果你谷歌我和单身,你可能会发现我写的帖子更详细。

答案 1 :(得分:31)

马特有点过于谦虚。他在这个主题上发表的文章是我读过的最好的文章之一,值得链接。 http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

答案 2 :(得分: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;

答案 3 :(得分:3)

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