簡體   English   中英

指定初始化器

[英]Designated Initializer

-(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" 還是第一個?

當一個類有多個初始化器時,它們中的一個或有時更多被定義為指定初始化器- 這些初始化器必須完全初始化類調用超類的指定初始化器,以便它被完全初始化。

其他初始化器稱為輔助初始化器,並且必須通過調用self最終調用指定的初始化器之一。 (參見Cocoa Fundamentals - Multiple initializers 。)

這個模型有兩個主要結果:

  • 您可以避免代碼重復和相應的錯誤; 對於大多數類,一個初始化器完成所有工作;
  • 當子類化時,您只需要覆蓋超類指定的初始化器和原始方法(與指定初始化器等效的非初始化器方法),因為超類的所有其他方法最終都會調用它們。 如果您需要更改行為,您當然可以覆蓋更多方法並且必須這樣做(再次參見Cocoa Fundamentals - Multiple initializers 。)

所以你的例子是正確的 - 1 個指定的初始化程序和 2 個輔助初始化程序,它們通過調用self來調用指定的初始化程序。

有 3 種不同的初始化程序,因此您可以使用它們中的任何一個 - 它們都沒有錯,它們允許您使用可變數據初始化類 - 主要是為了方便,因為最終它們都做同樣的事情。

您可以使用指定的字符串和日期(第一個也是最長的初始化程序)來初始化類,

或者您可以僅指定字符串並將日期設置為當前時間,

或者你可以有一個空字符串和當前時間。

請注意,調用:

[self init];

等於調用

[self initWithStr: nil];

這又等於

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

所以最終你無論如何都會調用相同的初始化程序。

您有一個指定的初始化程序讀取根初始化程序或完成所有工作的方法。 其他初始化器方法僅使用缺失參數的默認值調用此根初始化器。
您使用[NSDate date]而不是nil ,僅僅是因為當前日期是您的默認值。

您應該使用哪個初始化程序取決於您希望對象設置的值。 如果您有一個字符串和一個日期,則使用帶有字符串和日期的那個。 如果您沒有日期,則使用沒有日期而只有字符串的日期,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM