我有一些全局对象(几乎在所有应用程序屏幕中都使用),它们大多是在应用程序启动后立即创建的。我想从我所有的 ViewControllers 访问这些对象(没有别的,只有 ViewControllers)。在哪里存放?
我考虑过@property
,AppDelegate
但我认为(但我可能是错的)这是一个丑陋的解决方案。
对象可以相当复杂,这不是简单的类型。
我有一些全局对象(几乎在所有应用程序屏幕中都使用),它们大多是在应用程序启动后立即创建的。我想从我所有的 ViewControllers 访问这些对象(没有别的,只有 ViewControllers)。在哪里存放?
我考虑过@property
,AppDelegate
但我认为(但我可能是错的)这是一个丑陋的解决方案。
对象可以相当复杂,这不是简单的类型。
您可以通过将全局对象放置在具有用于访问全局对象的类方法的类中,实现+(void)load
以准备这些对象并将它们存储在静态变量中来使全局对象可访问。
标题:
@interface GlobalObjects
+(void)load;
+(MyObject1*)myObject1;
@end
执行:
#import "GlobalObjects.h"
static MyObject1* _myObject1 = nil;
@implementation GlobalObjects
+(void)load {
_myObject1 = [[MyObject1 alloc] init];
}
+(MyObject1*)myObject1 {
return myObject1;
}
@end
用法:
MyObject1 *shared = [GlobalObjects myObject1];
您还可以在其方法中将变量设为静态以进行延迟初始化。
是的,我使用 App Delegate 的属性,然后通过强制转换 sharedApplication 委托属性来访问它们。
__weak AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
希望这可以帮助,
乔纳森
AppDelegate 中的@property 是一个很好的解决方案。你也可以使用单例。
如果您只有一堆对象,您的应用程序委托就可以了。
否则,您可能会构建一种包含所有全局数据的“模型对象”。
或者,如果它们有任何结构,您可以将它们与 Core Data 一起存储。
但是,正如我所说,如果您只有几个对象,那么应用程序委托就可以了。
如果它仅在视图控制器中使用,您可以考虑将其存储在实际需要访问共享对象的最高级别视图控制器中(在创建/推送新控制器时,设置该引用计数属性)。
这样,您可能会想到主视图控制器使用其内容/模型填充详细视图控制器。
这真的远离了作为一个全球性的资格(和负担)。