【问题标题】:Designated Initializer指定初始化器
【发布时间】:2012-01-29 17:24:29
【问题描述】:
-(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”或第一个?

【问题讨论】:

    标签: iphone objective-c ios xcode


    【解决方案1】:

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

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

    此模型有两个主要后果:

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

    所以您的示例是正确的 - 1 个指定初始化程序和 2 个辅助初始化程序,它们通过调用 self 调用指定的初始化程序。

    【讨论】:

      【解决方案2】:

      有 3 种不同的初始化程序,因此您可以使用其中任何一种 - 它们都不是错误的,它们允许您使用可变数据初始化类 - 主要是为了方便,因为最终它们都做同样的事情。

      你可以用指定的字符串和日期(第一个和最长的初始化器)初始化类,

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

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

      注意调用:

      [self init];
      

      等于调用

      [self initWithStr: nil];
      

      这又等于

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

      所以最终你还是调用了相同的初始化器。

      【讨论】:

        【解决方案3】:

        您有一个指定的初始化程序读取根初始化程序或完成所有工作的方法。其他初始化器方法仅使用缺失参数的默认值调用此根初始化器。
        您使用[NSDate date] 而不是nil,只是因为当前日期是您的默认值。

        您应该使用哪个初始化程序取决于您希望对象设置的值。如果您有一个字符串和一个日期,则使用带有字符串和日期的那个。如果您没有日期,则使用没有日期且仅包含字符串的日期,依此类推。

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 2014-07-27
          • 2020-08-10
          • 2015-02-24
          • 2015-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多