1

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

因此,例如,在 UIViewController 子类中,我的代码如下所示:

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

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

但是,最近我开始先设置 self,因为我认为它self = [self init...]会替换类的当前实例,因此我会丢失该 self 的实例。所以,我开始做:

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

然后,我最近检查了原始版本,并意识到一切正常,并且没有必要进行更改。

所以,我的问题是:

  1. [super initWithNibName:bundle:] 做了什么导致它创建一个对象但不替换原始对象?
  2. 这两个版本中的一个比另一个更好使用还是它们都等效?如果一个更好,应该使用哪个?

提前致谢!

4

4 回答 4

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 值

于 2013-03-19T06:38:59.343 回答
1

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

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

   return self;
 }
于 2013-03-19T06:29:15.593 回答
0

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

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

    if(self)
    _value = val;

    return self;
}

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

于 2013-03-19T06:19:15.997 回答
0

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

于 2013-03-19T06:30:23.730 回答