Безопасно ли каскадировать конструкторы в Objective C?

Я хочу сделать следующее:

// 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, что приводит к потенциальным расхождениям, если код должен быть изменен позже.

1 ответ

Это безопасно, потому что self уже был выделен (с allocк тому времени init называется. Таким образом, методы могут быть вызваны для него, но его объекты просто еще не распределены.

Другие вопросы по тегам