如何使静态变量初始化

时间:2012-05-10 03:53:44

标签: iphone objective-c static

我想将“dataFilePath”保存为静态变量,以便在第一次使用“常量”时初始化它,而不需要实例化类,例如[常量SDataFilePath]。但真相是没有调用init方法。我怎样才能满足我的要求? (在Java中,构造方法将被称为第一次访问Class)。

@implementation Constants

static NSString *dataFilePath;

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这不可能这样做。您希望此路径是静态的任何原因?您可能希望查看使用getter设置dataFilePath,但不设置setter并将该类实例化为单例。这样,您可以通过某种内部方法设置路径,并将实例共享为单例。见here