我希望能够通过我的应用程序中的任何位置引用某些状态/对象。例如,用户登录到他们的应用程序,我需要调用Web服务并检索用户信息。然后,我希望能够从应用程序的任何位置访问此信息,如下所示:
myAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
user = delegate.u;
在app delegate中设置一个实例变量作为User对象,并在需要时从那里引用它是一种糟糕的方式吗?我通常在用户登录时将其设置在那里。
想听听专业人士如何处理这个。
答案 0 :(得分:52)
通常情况下,您应该只在以下情况下将内容连接到应用代理:
对于其他所有内容,您应该创建一个管理对它们的访问权限的单例。
Jason Coco建议通过应用程序控制器进行路由。在我的程序中,我通常会避免这种情况,因为我认为它在顶层承担了太多责任 - 我认为事情应尽可能自我管理,而且只有在同行之间需要协调时才应使用更高级别的管理。级别模块。
我不会链接我自己的博客,但如果你谷歌我和单身,你可能会发现我写的帖子更详细。
答案 1 :(得分:31)
答案 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)
通常你会向你的应用程序的控制器询问这些信息,它将负责知道如何存储它/在任何存在的数据模型中查找它。您的应用程序的控制器可能与应用程序委托相同或不同(在大多数简单应用程序中,它是相同的)。