当前位置:  开发笔记 > 前端 > 正文

iPhone正确使用Application Delegate

如何解决《iPhone正确使用ApplicationDelegate》经验,为你挑选了3个好方法。

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

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

是否在应用程序委托中将实例变量设置为User对象,并在需要时从那里引用它是一种糟糕的方式来实现它?我通常根据用户的登录设置它.

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



1> Matt Gallagh..:

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

从与应用委托相同的NIB文件创建(即单窗口界面中的静态UI元素)

与通过应用程序委托的应用程序级事件处理相关联(如"首选项"窗口的菜单项)

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

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

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


@jkp:单身人士在单元测试中可能很棘手,但由于单身人士不好,所以不会解释这一点.实际情况恰恰相反:它是单元测试的一个缺陷,它只能在命令模式实现方面表现出色,并且为每个单元测试设置状态机(如常见的桌面应用程序模型)都很麻烦.对于应用程序状态的每个元素使用方法参数,只是为了避免单例,是一个可怕的设计模式.正确的解决方案是交换模拟单例,就像在调用测试之前模拟任何其他对象(更改sharedInstance方法返回的对象)一样.
链接到博客文章:http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
我对在Cocoa代码中使用单身人士的想法缺乏批评感到失望.单身人士在某种意义上很容易"干净"(没有应用代表形式的全球神级别),但他们并不适合进行测试.大多数经验丰富的TDD从业者会建议使用DI,可能使用构造函数参数来传递状态或状态对象.我正在寻找有关如何在Cocoa中实现这一目标的一些信息,但我找到的建议是告诉我们使用Singleton模式.

2> Brad The App..:

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



3> e.James..:

我认为您的方法没有任何问题.我通常使用单例来处理这种情况:

// 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;

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有