2016-02-12 87 views
2

只要init調用[super init],在Objective C自定義init方法中調用[self init] OK?只要init調用[super init],在Objective C自定義init方法中調用[self init] OK?

I.e.可以說我們有一個有10個不同的自定義init方法的類(每個類都返回一個與類不同配置的對象)。其中大部分設置了該項目的一組獨特屬性。

但是,所有這些自定義初始化方法設置爲_foo = @"bar"; ..所以我們可以將_foo = @"bar"移動到常規init中並保證它會被調用?或者我們所有的自定義init方法都必須自己調用[super init]

我想不出爲什麼如果他們打電話[self init],因爲它調用[super init]會是壞的原因。如果這在某種程度上是不可取的,你能否解釋爲什麼?

I.e.是安全的在下面的例子中調用[self init]在initSalesReceiptWithTicket:

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     _foo = @"bar"; 
    } 
    return self; 
} 

- (instancetype)initSalesReceiptWithTicket:(TicketModel * _Nonnull)ticket { 
    self = [self init]; 
    if (self) { 
     NSError *error; 

     /* header */ 
     error = [self populateTotalsFieldsForTicket:ticket]; 
     if(error) { 
      CLS_LOG(@"Error in populating header fields for ticket. \n Error: %@ \n Ticket: %@",error,ticket); 
     } 

     // ... REST OF CODE ... 
    } 
    return self; 
} 

- (NSError *)populateTotalsFieldsForTicket:(TicketModel *)ticket { 
    NSError *error; 

    _subTotal  = [GlobalUtility checkNull:ticket.ticketSubTotal]; 
    _tax    = [GlobalUtility checkNull:ticket.ticketTaxAmount]; 
    _taxPercentage = [GlobalUtility checkNull:ticket.ticketTaxPercentage]; 
    _total   = [GlobalUtility checkNull:ticket.orderTotal]; 

    if(_total == 666.666) { 
     error = [NSError errorWithDomain:@"hell" code:666 userInfo:@{@"foo":@"bar"}]; 
    } 

    return error; 
} 

回答

2

是的,這是應該做的方式。更確切地說,應該有一個其他初始化器調用的指定初始化器。在您的示例中,純-init是您的指定初始化程序。

參見 「多個初始化方法和指定初始化」:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW3

+0

感謝喬恩。是的,如果我從頭開始寫這個,我實際上更喜歡使用一個抽象類,它可以包含我指定的內容,但我只是試圖在最佳體系結構和修復其他人可怕的意大利麪條之間做出妥協。代碼混亂儘可能快:D – CommaToast

相關問題