我想将“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
答案 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