Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在目标C中级联构造函数安全吗?_Objective C_Multiple Constructors - Fatal编程技术网

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
方法呢?