2016-02-12 37 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

相关问题