0

私は次のことをしたい:

// I want to do this! :D

- (instancetype) init
{
    return [self initWithVal1:[NSDecimalNumber zero] val2:MyEnumDefault];
}

- (instancetype) initWithVal1:(NSDecimalNumber*)val1 val2:(MyEnum)val2
{
    return [self initWithVal1:val1 val2:val2 val3:12];
}

- (instancetype) initWithVal1:(NSDecimalNumber*)val1 val2:(MyEnum)val2 val3:(NSInteger)val3
{
    if (self = [super init])
    {
        _prop1 = val1;
        _prop2 = val2;
        _prop3 = val3;
    }
    return self;
}

しかし、私が呼び出したとき[self initWithVal1:[NSDecimalNumber zero]selfまだ初期化されていないことがわかっています。ただし、例でこれを示す itnernet の周りの例を見てきました。これは安全ですか、それとも以下のように毎回初期化する必要がありますか?

// I don't want to do this... :(

- (instancetype) init
{
    if (self = [super init])
    {
        _prop1 = [NSDecimalNumber zero];
        _prop2 = MyEnumDefault;
        _prop3 = 12;
    }
    return self;
}

- (instancetype) initWithVal1:(NSDecimalNumber*)val1 val2:(MyEnum)val2
{
    if (self = [super init])
    {
        _prop1 = val1;
        _prop2 = val2;
        _prop3 = 12;
    }
    return self;
}

- (instancetype) initWithVal1:(NSDecimalNumber*)val1 val2:(MyEnum)val2 val3:(NSInteger)val3
{
    if (self = [super init])
    {
        _prop1 = val1;
        _prop2 = val2;
        _prop3 = val3;
    }
    return self;
}

_prop3 = 12のようにコードを複製し、後でコードを変更する必要がある場合に不一致が生じる可能性があるため、このアプローチは好きではありません。

4

1 に答える 1

0

が呼び出されるまでに ( で)self既に割り当てられているため、安全です。そのため、メソッドを呼び出すことはできますが、そのオブジェクトはすべてまだ割り当てられていません。allocinit

于 2015-09-14T22:33:38.810 に答える