指定初始化程序

Mic*_*l C 3 iphone xcode objective-c ios

-(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];
}
Run Code Online (Sandbox Code Playgroud)

嘿伙计们,我不确定我是否知道如何使用"指定的初始化程序".首先不是

return [self initWithStrAndDate:inString date:[NSDate date]];
Run Code Online (Sandbox Code Playgroud)

这个错了?不应该这样:

return [self initWithStrAndDate:inString date:nil];
Run Code Online (Sandbox Code Playgroud)

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

CRD*_*CRD 10

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

其他初始化程序称为辅助初始化程序,并且必须通过调用self最终调用其中一个指定的初始化程序.(参见Cocoa Fundamentals - 多个初始化器.)

这个模型有两个主要后果:

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

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