我正在编写一个iOS应用程序,其中有一个共同的对象,应用程序中的所有视图都需要访问。
我一直在viewDidLoad事件(第一个视图控制器)中创建和初始化对象,然后将对该对象的引用传递给需要它的所有其他视图。这似乎不是正确的做事方式,感觉就像我在某种程度上打破了MVC模式,因为我依赖于这个特定的视图始终是第一个加载以便设置整个应用程序所需的对象。
我现在修改了我的应用程序,在appDelegate“didFinishLaunching ...”中进行基本对象创建和初始化。这现在正在工作,我可以从所有其他视图访问此公共对象,而无需将引用从一个视图传递到另一个视图。
在我继续走得太远之前,我希望让人们了解这是否是正确的做事方式,或者我是否应该做其他事情?对不起,如果这看起来像一个微不足道的问题,我只是在学习,并想学习如何正确地做事。
提前致谢: - )
答案 0 :(得分:1)
将你的全局对象初始化放在didFinishLaunching中比在didLoad中使用它更好。
有些人会在这里不同意我并说你不应该全局停止,但我个人认为拥有某种全球状态是可以接受的。我喜欢一个好的面向对象的应用程序,但是在固体OOP和具有一些全局变量提供的灵活性之间存在平衡。
我认为最终做任何适合你的事情,拥有全局状态的主要缺点是它变得难以维护并且有可能引入很多错误/意外行为,尤其是在大型应用程序中,而如果你坚持MVC模式,然后你的应用程序中的每个视图只是做它的意图,而不会不必要地影响应用程序的其他部分。
如今,我倾向于坚持MVC / OOP原则,但我有一个[AppDelegate] sharedAppDelegate]单例我可以用来访问某些点的变量。我在这里有非常非常少的变量,但它们确实派上用场,即现在我的应用程序有一个由此类管理的共享'加载HUD',而我的sharedAppDelegate还包含许多用于启动HTTP,解析JSON等的静态方法这节省了很多时间。
在appDelegate中拥有全局信息的另一种方法是使用NSUserDefaults来存储键值信息
希望无论如何都有帮助,就像我说有些人会不同意我,但最终归结为个人喜好,而且就MVC模型的刚性与灵活性而言,你的平衡是
答案 1 :(得分: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,因此您不必担心在那里进行计时。