2012-05-10 220 views
-1

我想保存「dataFilePath」作爲一個靜態變量,以便它可以被初始化時第一次使用「常量」,無需實例化類,例如[常量SDataFilePath。但真正的原因是init方法沒有被調用。我該怎麼做才能滿足我的要求? (在Java中,構造方法將被稱爲訪問類的第一時間)。如何讓靜態變量初始化

@implementation Constants 

static NSString *dataFilePath; 

-(id)init 
{ 
    NSLog(@"init!"); 
    if(self = [super init]) { 
     dataFilePath = [self getDataFilePathWithArg:dbfile]; 
    }  
    return self; 
} 

+(NSString *)SDataFilePath { 
    return dataFilePath; 
} 
.... 
@end 

回答

1

那麼你可以使常量單身。留下你的代碼是怎麼回事,這方法添加到.M:

+ (Constants *)sharedConstants 
{ 
    static Constants *_sharedConstants = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _sharedConstants = [[self alloc] init]; 
    }); 

    return _sharedConstants; 
} 

而且方法聲明爲.H:

+ (Constants *)sharedConstants; 

然後訪問您的變量是這樣的:

[[Constants sharedConstants] SDataFilePath] 

這會在第一次訪問[Constants sharedConstants](並且僅在第一次)時強制init。此外,您需要將+(NSString *)SDataFilePath更改爲實例方法,而不是類方法:

-(NSString *)SDataFilePath 
0

這不能這樣做。爲什麼你想要這條路徑是靜態的?你可能想看看設置dataFilePath與getter,但沒有setter和實例化類作爲一個單身。這樣你就可以通過一些內部方法來設置路徑,並將實例作爲單例共享。請參閱here