-1

「dataFilePath」を静的変数として保存して、「Constants」を初めて使用するときに初期化できるようにし、[Constants SDataFilePath] などの Class をインスタンス化する必要がないようにしたいと考えています。しかし、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
4

2 に答える 2

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
于 2012-05-10T04:11:04.047 に答える
0

これは、この方法では実行できません。このパスを静的にしたい理由はありますか? ゲッターを使用して dataFilePath を設定することを検討することをお勧めしますが、セッターを使用せず、クラスをシングルトンとしてインスタンス化します。そうすれば、何らかの内部メソッドでパスを設定し、インスタンスをシングルトンとして共有できます。こちらをご覧ください

于 2012-05-10T04:17:12.187 に答える