2012-05-01 39 views
0

我想要只應初始化一次的類並返回第一次計算出的某個值。低於正確的方法?靜態方法目標c - 初始化一次

@property (nonatomic, retain) NSString *userAgent; 

@implementation UserAgent 
@synthesize userAgent = _userAgent; 


+ (NSString *) userAgentString 
{ 
    UserAgent *thisClass; 
    if(self == nil) 
    { 
     thisClass = [[UserAgent alloc] init]; 
    } 

    if (thisClass.userAgent == nil) 
    { 
     return @"not initialized"; 
    } 

    return thisClass.userAgent; 
} 
+3

搜索有關如何做到這一點的好例子單上的信息。 – lnafziger

+1

在UserAgent * thisClass之前添加靜態,你應該沒問題。 '靜態的UserAgent * thisClass;' –

+0

[單身的線程安全的實例](http://stackoverflow.com/questions/2199106/thread-safe-instantiation-of-a-singleton) – Chuck

回答

3

  1. thisClass是一個局部變量。這意味着,每當調用+userAgentString時,該值將被重置(垃圾)。至少讓它static

  2. self的意思是不是您所期望的一類方法裏面是什麼。你的意思是thisClass

  3. 即使與上述修正,該方法不是線程安全的,其可以是或可以不是好的。

參見Create singleton using GCD's dispatch_once in Objective CSingleton in iOS 5?作爲例子正確構建

+0

HTTP的可能重複:// iphone .galloway.me.uk/iphone-sdktutorials/singleton-classes/ –

+0

@i_raqz:這與http://stackoverflow.com/questions/8796529/singleton-in-ios-5的第一個答案相同。 – kennytm

0

幾個變化。首先,thisClass應該是靜態的。其次,你在靜態方法中沒有self指針,所以你應該在那裏使用thisClass。像這樣:

+ (NSString *) userAgentString 
{ 
    static UserAgent *thisClass; 
    if(thisClass == nil) 
    { 
     thisClass = [[UserAgent alloc] init]; 
    } 

    if (thisClass.userAgent == nil) 
    { 
     return @"not initialized"; 
    } 

    return thisClass.userAgent; 
} 

此外,更好的方法可能是使用單例,如評論者所述。