具有全局变量的共享实例

时间:2015-02-28 13:54:07

标签: ios objective-c static singleton 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:,这样我就可以在任何其他类中访问(和修改)我的全局变量,如下所示:

OtherClass.m

NSMutableArray *types = [GlobalVariables docType];
...
[GlobalVariables addNewDocType:@"Slide"];

是否可以接受? 我知道我可以这样得到这些变量:

OtherClass.m

GlobalVariables *sharedVariables = [GlobalVariables sharedInstance];
NSMutableArray *types = [sharedVariables docType];
...
[sharedVariables addNewDocType:@"Slide"];

但这意味着使用这些变量的任何其他类都应该具有GlobalVariables属性?

1 个答案:

答案 0 :(得分:0)

从技术上讲,你拥有的不是全局变量,而是单身。它的名字GlobalVariables不是很具描述性。由于iOS应用程序中的单例通常用于制作模型,因此很有可能将GlobalVariables重命名为Model

接下来,您可以通过在使用[Model instance]的其他类中创建实例变量来最小化调用Model的需要(尽管这不是必需的 - 这只是方便)。但是有一个替代计划也可以起作用:将 class 方法添加到Model以检索事件和文档类型,如下所示:

+(NSMutableArray*) eventType {
    return [Model instance].eventType;
}
+(NSMutableArray*) docType {
    return [Model instance].docType;
}

这也会缩短代码,并且可能通过消除额外的间接级别使其更具可读性。