Безопасно ли каскадировать конструкторы в 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
называется. Таким образом, методы могут быть вызваны для него, но его объекты просто еще не распределены.