指定初始化程序

时间:2012-01-29 17:24:29

标签: iphone objective-c ios xcode

-(id)initWithStrAndDate: (NSString *)inString date:(NSDate *)inDate
{
  if (self = [super init])
  {
    [self setStr:inString];
    [self setDate:inDate];
  }
  return self;
}

-(id)initWithStr: (NSString *)inString
{
      return [self initWithStrAndDate:inString date:[NSDate date]];
}

-(id)init
{
  return [self initWithStr:nil];
}
嘿伙计们,我不确定我是否知道如何使用“指定的初始化程序”。首先不是

return [self initWithStrAndDate:inString date:[NSDate date]];
这个错了吗?不应该这样:

return [self initWithStrAndDate:inString date:nil];

为什么我们使用3种不同的初始化器呢?我的意思是什么时候我们使用“ - (id)init”或“ - (id)initWithStr:(NSString *)inString”或第一个?

3 个答案:

答案 0 :(得分:10)

当一个类有多个初始化器时,其中一个或有时更多被定义为指定的初始化器 - 这些初始化器必须完全初始化类并且调用指定的初始化器超类,以便它完全初始化。

其他初始化程序称为辅助初始化程序必须,通过调用self,最终调用其中一个指定的初始化程序。 (见Cocoa Fundamentals - Multiple initializers。)

此模型有两个主要后果:

  • 您可以避免代码重复和相应的错误;对于大多数类,一个初始化程序完成所有工作;和
  • 当进行子类化时,你只需要覆盖超类指定的初始化器和原始方法(非初始化方法等效于指定的初始化器),因为超类的所有其他方法最终叫这些。您当然可以覆盖更多方法,如果您需要更改行为,则必须执行此操作(请再次参阅Cocoa Fundamentals - Multiple initializers。)

所以你的例子是正确的 - 1个指定的初始化器和2个辅助初始化器,通过调用self来调用指定的初始化器。

答案 1 :(得分:3)

有3个不同的初始值设定项,因此您可以使用其中任何一个 - 它们中的任何一个都不对,它们允许您使用可变数据初始化类 - 主要是为了方便,因为它们最终都做同样的事情。 / p>

您可以使用指定的字符串和日期(第一个和最长的初始化程序)

来初始化该类

或者您只能指定字符串并将日期设置为当前时间

或者你可以有一个空字符串和当前时间。

请注意:

[self init];

等于调用

[self initWithStr: nil];

这又等于

[self initWithStrAndDate: nil date:[NSDate date]];

所以最后你要调用相同的初始化器。

答案 2 :(得分:0)

您有一个指定的初始值设定项读取根初始值设定项或执行所有工作的方法。其他初始化方法仅使用缺省参数的默认值调用此根初始值设定项 您使用[NSDate date]代替nil,只是因为当前日期是您的默认值。

您应该使用哪个初始值设定项取决于您希望对象设置的值。如果您有字符串和日期,则使用带字符串和日期的字符串。如果您没有日期,则使用没有日期的日期,只使用字符串,依此类推。