自定义对象初始化器

时间:2013-03-19 06:06:06

标签: ios objective-c initialization

我一直在为我的对象创建自定义初始值设定项,因为它比其他方式设置变量感觉更好。在这些初始化器中,我通常设置对象的变量,然后返回对主init的调用。

因此,例如,在UIViewController子类中,我的代码看起来像这样:

-(id)initWithValue:(int)val {
    self.value = val;
    return [self initWithNibName:nil bundle:nil];
}

其中value是属于该ViewController子类的整数,并且通常有更多的值。

然而,最近我开始设置自我,因为我认为self = [self init...]将替换该类的当前实例,因此我将失去自我的实例。 所以,我已经开始做了:

-(id)initWithValue:(int)val {
    self = [self initWithNibName:nil bundle:nil];
    self.value = val;
    return self;
}

我最近检查了原始版本并意识到一切正常并且更改是不必要的。

所以,我的问题是:

  1. [super initWithNibName:bundle:]做什么导致它创建一个对象而不是替换原始对象?
  2. 两个版本中的一个比另一个更好吗?它们是否相同?如果一个更好,应该使用哪个?
  3. 先谢谢!

4 个答案:

答案 0 :(得分:2)

您应该按照以下方式进行:

- (id)initWithValue:(int)val {
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        _value = val;
    }
    return self;
}

在iOS中,如果发送到init方法的参数无效,则常见的模式是返回nil。该值将是两件事之一:当前指向self或nil的指针。如果对super的调用返回nil,那么对象设置不正确,所以你也应该返回nil。做self = [super initWithNibName:nil bundle:nil];只是让人更容易尊重super

返回的可能的nil值

答案 1 :(得分:1)

请使用以下代码覆盖init方法

 -(id)initWithValue:(int)val 
 {
   self = [super init];
   if(self)
     {
    self.value = val;
    }

   return self;
 }

答案 2 :(得分:0)

您编写的第一个代码不会存储value,因为在创建对象之前,您尝试存储数据。 但是,第二个代码需要对更好的实践进行一些小修改,就像这样......

-(id)initWithValue:(int)val {
    self = [self initWithNibName:nil bundle:nil];

    if(self)
    _value = val;

    return self;
}

希望这对你有用......: - )

答案 3 :(得分:0)

[super initWithNibName:bundle:]实际上调用了超类的方法。 如果你使用[self initWithNibName:bundle:]实际上它会调用initWithNibName:bundle的重写:当然你必须重写它,否则它也会调用超类方法。所以如果你想在initWithNibName的重写中做一些初始化,那么你可以使用[self initWithNibName:bundle:]但是如果你不需要做额外的初始化,那么to方法之间没有区别;