0

我正在编写一个 iOS 应用程序,其中有一个公共对象,应用程序内的所有视图都需要访问该对象。

我一直在(第一个视图控制器的)viewDidLoad 事件中创建和初始化对象,然后将对该对象的引用传递给需要它的所有其他视图。这似乎不是正确的做事方式,感觉就像我在某种程度上打破了 MVC 模式,因为我依赖这个特定的视图总是第一个加载以便设置整个应用程序需要的对象。

我现在已经修改了我的应用程序以在 appDelegate“didFinishLaunching...”中进行基本的对象创建和初始化。这现在可以工作了,我可以从我的所有其他视图访问这个公共对象,而无需将引用从一个视图传递到另一个视图。

在我走得太远之前,我希望得到人们的意见,这是否是正确的做事方式,或者我是否应该做其他事情?抱歉,如果这似乎是一个微不足道的问题,我只是在学习并想学习如何正确地做事。

提前致谢 :-)

4

2 回答 2

1

将全局对象初始化放在 didFinishLaunching 中比将其放在 didLoad 中更好。

有些人会不同意我的观点,并说你不应该让 globals 句号,但我个人认为拥有某种全局状态是可以接受的。我喜欢一个好的面向对象的应用程序,但是在可靠的 OOP 和拥有一些全局变量所提供的灵活性之间需要取得平衡。

我认为最终做任何适合你的事情,拥有全局状态的主要缺点是它变得难以维护并且有可能引入很多错误/意外行为,尤其是在大型应用程序中,而如果你坚持MVC 模式,然后你的应用程序中的每个视图都只是做它应该做的事情,而不会不必要地影响应用程序的其他部分。

如今,我在很大程度上倾向于坚持 MVC / OOP 原则,但有一个 [AppDelegate]sharedAppDelegate] 单例可以用来在某些点访问变量。我在这里有非常非常少的变量,但它们确实派上了用场,即现在我的应用程序有一个由此类管理的共享“加载 HUD”,并且我的 sharedAppDelegate 还包含许多用于启动 HTTP、解析 JSON 等的静态方法这节省了很多时间。

在您的 appDelegate 中拥有全局信息的一种替代方法是使用 NSUserDefaults 来存储键值信息

希望无论如何都会有所帮助,就像我说的有些人会不同意我的观点,但最终归结为个人喜好,而在 MVC 模型的刚性与灵活性方面,您的平衡点是

于 2013-07-14T08:28:40.527 回答
1

在不重复已经回答的内容的情况下,我建议您制作自己的 Singleton 对象来保存您的“全局”,这样您就不会用它弄乱您的 AppDelegate。

@interface MyGlobalDataController : NSObject

@property (nonatomic, strong) MyData *myData;

+(MyGlobalDataController *)sharedInstance;

@end

@implementation MyGlobalDataController

static MyGlobalDataController *MyGlobalDataControllerSharedInstance = nil;

- (id)init {
    self = [super init];
    if (self) {
        // do whatever needs doing 
    }
    return self;
}

+(MyGlobalDataController *)sharedInstance {
    @synchronized(self) {
        if (MyGlobalDataControllerSharedInstance == nil) {
            MyGlobalDataControllerSharedInstance = [[MyGlobalDataController alloc] init];
        }
    }
    return MyGlobalDataControllerSharedInstance;
}

@end

第一次访问 sharedInstance 时,将调用 init,因此您不必担心那里的时间问题。

于 2013-07-14T08:51:21.057 回答