具有全局变量的共享实例
Shared instance with global variables
感谢之前的一些问题,我设法在我的整个应用程序中共享全局变量。
但我仍然想知道我所做的是否是一个好的做法:
GlobalVariables.h
@interface GlobalVariables : NSObject
@property (nonatomic, retain) NSMutableArray *eventType;
@property (nonatomic, retain) NSMutableArray *docType;
// Getters of properties
+ (NSMutableArray *) eventType;
+ (NSMutableArray *) docType;
GlobalVariables.m
@implementation GlobalVariables
+ (id)sharedInstance {
static GlobalVariables *instance = nil;
static dispatch_once_t onceToken;
// Assert that only one instance of this class will be created
dispatch_once(&onceToken, ^{
instance = [[GlobalVariables alloc] init];
// Default values for our shared variables
NSArray *defaultEvents = @[@"Default",@"Reunion",@"Famille",@"Vacances"];
NSArray *defaultDocs = @[@"Handwritten Document",@"Business Card",@"Whiteboard",@"Invoice",@"Picture",@"Printed Document",@"Table",@"To Note"];
[instance setEventType:[NSMutableArray arrayWithArray:defaultEvents]];
[instance setDocType:[NSMutableArray arrayWithArray:defaultDocs]];
});
return instance;
}
// Getter of eventType property
+ (NSMutableArray *) eventType {
GlobalVariables *instance = [GlobalVariables sharedInstance];
return instance.eventType;
}
// Getter of docType property
+ (NSMutableArray *) docType {
GlobalVariables *instance = [GlobalVariables sharedInstance];
return instance.docType;
}
// Add a new document type to docType property
+ (void)addNewDocType:(NSString*)doc {
GlobalVariables *instance = [GlobalVariables sharedInstance];
[instance.docType addObject:doc];
}
如您所见,我在 getter(和其他方法)中调用了 sharedInstance:
,这样我就可以访问(和修改)任何其他 class 中的全局变量,如下所示:
OtherClass.m
NSMutableArray *types = [GlobalVariables docType];
...
[GlobalVariables addNewDocType:@"Slide"];
是否可以接受?
我知道我可以通过这种方式获得这些变量:
OtherClass.m
GlobalVariables *sharedVariables = [GlobalVariables sharedInstance];
NSMutableArray *types = [sharedVariables docType];
...
[sharedVariables addNewDocType:@"Slide"];
但这是否意味着使用这些变量的任何其他 class 都应该具有 GlobalVariables 属性?
从技术上讲,您拥有的不是全局变量,而是单例。不过,它的名称 GlobalVariables
并不是很具有描述性。由于 iOS 应用程序中的单例通常用于制作模型,因此很有可能您的 GlobalVariables
可以重命名为 Model
.
接下来,您可以通过在使用 Model
的其他 class 中创建一个实例变量来最大程度地减少调用 [Model instance]
的需要(尽管这不是必需的 - 它只是一个方便)。但是还有一个替代计划也可能有效:将 class 方法添加到 Model
以检索事件和文档类型,如下所示:
+(NSMutableArray*) eventType {
return [Model instance].eventType;
}
+(NSMutableArray*) docType {
return [Model instance].docType;
}
这也会缩短代码,并可能通过消除额外的间接级别使其更具可读性。
感谢之前的一些问题,我设法在我的整个应用程序中共享全局变量。
但我仍然想知道我所做的是否是一个好的做法:
GlobalVariables.h
@interface GlobalVariables : NSObject
@property (nonatomic, retain) NSMutableArray *eventType;
@property (nonatomic, retain) NSMutableArray *docType;
// Getters of properties
+ (NSMutableArray *) eventType;
+ (NSMutableArray *) docType;
GlobalVariables.m
@implementation GlobalVariables
+ (id)sharedInstance {
static GlobalVariables *instance = nil;
static dispatch_once_t onceToken;
// Assert that only one instance of this class will be created
dispatch_once(&onceToken, ^{
instance = [[GlobalVariables alloc] init];
// Default values for our shared variables
NSArray *defaultEvents = @[@"Default",@"Reunion",@"Famille",@"Vacances"];
NSArray *defaultDocs = @[@"Handwritten Document",@"Business Card",@"Whiteboard",@"Invoice",@"Picture",@"Printed Document",@"Table",@"To Note"];
[instance setEventType:[NSMutableArray arrayWithArray:defaultEvents]];
[instance setDocType:[NSMutableArray arrayWithArray:defaultDocs]];
});
return instance;
}
// Getter of eventType property
+ (NSMutableArray *) eventType {
GlobalVariables *instance = [GlobalVariables sharedInstance];
return instance.eventType;
}
// Getter of docType property
+ (NSMutableArray *) docType {
GlobalVariables *instance = [GlobalVariables sharedInstance];
return instance.docType;
}
// Add a new document type to docType property
+ (void)addNewDocType:(NSString*)doc {
GlobalVariables *instance = [GlobalVariables sharedInstance];
[instance.docType addObject:doc];
}
如您所见,我在 getter(和其他方法)中调用了 sharedInstance:
,这样我就可以访问(和修改)任何其他 class 中的全局变量,如下所示:
OtherClass.m
NSMutableArray *types = [GlobalVariables docType];
...
[GlobalVariables addNewDocType:@"Slide"];
是否可以接受? 我知道我可以通过这种方式获得这些变量:
OtherClass.m
GlobalVariables *sharedVariables = [GlobalVariables sharedInstance];
NSMutableArray *types = [sharedVariables docType];
...
[sharedVariables addNewDocType:@"Slide"];
但这是否意味着使用这些变量的任何其他 class 都应该具有 GlobalVariables 属性?
从技术上讲,您拥有的不是全局变量,而是单例。不过,它的名称 GlobalVariables
并不是很具有描述性。由于 iOS 应用程序中的单例通常用于制作模型,因此很有可能您的 GlobalVariables
可以重命名为 Model
.
接下来,您可以通过在使用 Model
的其他 class 中创建一个实例变量来最大程度地减少调用 [Model instance]
的需要(尽管这不是必需的 - 它只是一个方便)。但是还有一个替代计划也可能有效:将 class 方法添加到 Model
以检索事件和文档类型,如下所示:
+(NSMutableArray*) eventType {
return [Model instance].eventType;
}
+(NSMutableArray*) docType {
return [Model instance].docType;
}
这也会缩短代码,并可能通过消除额外的间接级别使其更具可读性。