2013-04-15 40 views
2

我目前正在为我的应用程序编写助手类。该助手类将返回全局可访问的变量。或dispatch_once vs static

[MyHelper employers],我也可以访问它像这样[[MyHelper sharedHelper] employers]什么是每种方法的好处,他们两人都:我创建了一个简单的辅助,如下图所示:

@interface MyHelper : NSObject 
{ 

} 

+(id) sharedHelper; 

+(NSMutableArray *) employers; 


+(id) sharedHelper 
{ 
    static MyHelper *sharedHelper = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken,^{ 

     sharedHelper = [[self alloc] init]; 
    }); 

    return sharedHelper; 
} 

+(NSMutableArray *) employers 
{ 
    return _employers; 
} 

现在我可以访问雇主喜欢这个相同。

回答

2

我假设雇主数组类MyHelper的属性。

如果你调用[MyHelper雇主]没有调用[MyHelper sharedHelper]你可以得到不正确的结果(雇主数组的值是垃圾)。

也许这里的最佳实践是在+使用懒加载(NSMutableArray的*)的雇主并获得静态变量OUT +(ID)sharedHelper的:

static MyHelper *sharedHelper = nil; 
static dispatch_once_t onceToken; 

+(id) sharedHelper 
{ 
    dispatch_once(&onceToken,^{ 

     sharedHelper = [[self alloc] init]; 
    }); 

    return sharedHelper; 
} 

+(NSMutableArray *) employers 
{ 
    if(!sharedHelper) 
     [MyHelper sharedHelper]; 

    return _employers; 
} 
+0

在你的雇主类方法中,你试图直接访问'_employers'伊娃。我不认为你可以用类方法做到这一点。或者是暗示他让'_employers'成为全球性的? – Rob

+1

你说得对。我尝试尽可能少修改问题中包含的版本,所以我想_employers是某种静态或全局变量。 –

0

employers类方法是引用_employers,这是大概是你的类的一个实例变量。你不能这样做。此外,即使你做了一些变通马虎,就像一个全局变量,你有没有保证_employers已经被实例化,除非employers类方法也确保了sharedHelper被调用。

所以,一对夫妇的想法:

  1. 你真的应该有employers一些类属性(我假设你做了,但是省略它简洁,但我们包括在这里消除歧义):

    @interface MyHelper : NSObject 
    
    @property (nonatomic, strong) NSMutableArray *employers; 
    
    @end 
    
  2. 我相信你init方法可以初始化employers对象

    - (id)init 
    { 
        self = [super init]; 
        if (self) { 
         _employers = [[NSMutableArray alloc] init]; 
        } 
        return self; 
    } 
    
  3. 您现有的sharedHelper方法是完全正常的。

  4. 如果你想有一个employers类的方法,但是,应该访问employers实例方法:

    + (NSMutableArray *)employers 
    { 
        return [[MyHelper sharedHelper] employers]; 
    } 
    

做完了这一切,你的类会是什么样子:

@interface MyHelper : NSObject 

@property (nonatomic, strong) NSMutableArray *employers; 

+ (id)sharedHelper; 
+ (NSMutableArray *)employers; 

@end 

@implementation MyHelper 

+ (id)sharedHelper 
{ 
    static MyHelper *sharedHelper = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken,^{ 
     sharedHelper = [[self alloc] init]; 
    }); 

    return sharedHelper; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     _employers = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

+ (NSMutableArray *)employers 
{ 
    return [[MyHelper sharedHelper] employers]; 
} 

@end 

这是有效的,但话虽如此,作为一个风格问题,我个人不会推荐类方法,employers,当你有一个同名的属性的getter方法。似乎有点混乱。我认为切除类employers方法,并与该会为你合成的标准getter方法坚持下来,导致刚:

@interface MyHelper : NSObject 

@property (nonatomic, strong) NSMutableArray *employers; 

+ (id)sharedHelper; 

@end 

@implementation MyHelper 

+ (id)sharedHelper 
{ 
    static MyHelper *sharedHelper = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken,^{ 
     sharedHelper = [[self alloc] init]; 
    }); 

    return sharedHelper; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     _employers = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

@end 

,然后使用这个MyHelper类其他代码可以简单地指[[MyHelper sharedHelper] employers]自己。