2013-04-15 43 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]自己。