我希望能够通过我的应用程序中的任何位置引用某些状态/对象.例如,用户登录到他们的应用程序,我需要调用Web服务并检索用户信息.然后,我希望能够从应用程序的任何位置访问此信息,如下所示:
myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; user = delegate.u;
是否在应用程序委托中将实例变量设置为User对象,并在需要时从那里引用它是一种糟糕的方式来实现它?我通常根据用户的登录设置它.
想听听专业人士如何处理这个.
通常,您应该只将以下内容连接到应用代理:
从与应用委托相同的NIB文件创建(即单窗口界面中的静态UI元素)
与通过应用程序委托的应用程序级事件处理相关联(如"首选项"窗口的菜单项)
对于其他所有内容,您应该创建一个管理对它们的访问权限的单例.
Jason Coco建议通过应用程序控制器进行路由.在我的程序中,我通常会避免这种情况,因为我认为它在顶层承担了太多的责任 - 我认为事情应尽可能自我管理,并且只有在同行之间需要协调时才应使用更高级别的管理.级别模块.
我不会链接我自己的博客,但如果你谷歌我和单身,你可能会发现我写的帖子更详细.
马特有点过于谦虚.他在这个主题上发表的文章是我读过的最好的文章之一,值得链接. http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
我认为您的方法没有任何问题.我通常使用单例来处理这种情况:
// 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;