Objective c 在目标C中级联构造函数安全吗?
我想做以下工作:Objective c 在目标C中级联构造函数安全吗?,objective-c,multiple-constructors,Objective C,Multiple Constructors,我想做以下工作: // 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:v
// 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;
}
我不喜欢这种方法,因为它会复制代码,比如
\u prop3=12
,如果以后必须更改代码,这会导致潜在的差异。它是安全的,因为self
已经分配(使用alloc
)当调用它的init
时。因此,可以对它调用方法,但它的对象都尚未分配。“但我知道,当我调用[self initWithVal1:[NSDecimalNumber zero]时,self尚未初始化。”–是的,这就是为什么你称它为初始值设定项。问题是什么?是的,一般建议你重复使用初始值设定项的代码,并且只在其中一个代码中进行实际初始化(甚至还有一个名称,它被称为“指定初始值设定项”).@TheParamagneticCroissant问题是我正在向一个尚未初始化的对象发送消息?我正在尝试用第一个片段执行指定的初始化模式。我已经回答了这一部分…这不仅是安全的,而且是推荐的。第一组代码很好。它是正确的和典型的。它不可能是nil
。您首先调用了alloc
,如果self
是nil
,那么您将如何调用init
方法呢?