iOS:使用app委托来容纳全局变量

时间:2013-10-05 15:46:27

标签: ios objective-c cocoa-touch

收集我希望可以从app委托中的所有类访问的变量并通过[[UIApplication sharedApplication] delegate] someProperty]

获取变量是不好的做法

2 个答案:

答案 0 :(得分:7)

你问题的真正解决方案不是将一种形式的全球国家替换为另一种形式(即单身人士)。

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

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

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

使用依赖注入

请注意,单身可以被视为anti-pattern。如果你将这些单例注入需要它们的类中并不太糟糕,但是它肯定不建议硬连线它们(不幸的是,这也是一种常见做法),因为这会促进过于紧密的耦合,凝聚力并且需要复杂的调配才能执行单元测试。

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

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

通知

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