9

存放我希望从应用程序委托中的所有类中访问的变量并通过以下方式获取它们是不好的做法吗[[UIApplication sharedApplication] delegate] someProperty]

4

2 回答 2

7

您问题的真正解决方案不是用另一种形式的全局状态(即单例)替换一种形式的全局状态。

您应该做的是将状态放入应用程序委托中实例化的“模型”类中,然后将它们传递给需要它们的应用程序部分(例如视图控制器),从而完全消除您的全局状态问题。

于 2013-10-05T17:50:00.500 回答
3

以这种方式将 AppDelegate 作为应用程序范围变量的容器加载通常不是一个好习惯。它很快就会变得笨拙。

一种常见的做法是定义一些单例对象,如下所示:

+ (instancetype)shared
{
    static dispatch_once_t onceToken;
    static MyServiceClient* instance;

    dispatch_once(&onceToken, ^  //Use GCD to make a singleton with thread-safety
    {
        instance = [[self alloc] init];
    });
    return instance;
}

然后,您可以将这些对象作为参数提供给需要它们作为协作者的类。

使用依赖注入

请注意,尽管可以将单例视为反模式。如果你将这些单例注入到需要它们的类中,这还不错,但是绝对不建议对它们进行硬连接(不幸的是,这也是一种常见的做法),因为这会促进过紧的耦合、内聚并需要复杂的调配才能执行单元测试。

另一种方法是使用依赖注入,在这种情况下,在大多数情况下,对象甚至不需要是单例的。您可以根据需要为给定的用例实例化协作组件的对象图。这样做的好处是在资源受限的设备上使用更少的内存。

一个常见的误解是您需要一个库来使用依赖注入。你没有。不过它可以提供帮助。我创建了一个名为Typhoon的依赖注入容器。

通知

实现类之间松散协作的另一种方法是使用通知

于 2013-10-11T05:58:45.383 回答