只要 init 调用 [super init],在 Objective C 自定义 init 方法中调用 [self init] 就可以吗?
即假设我们有一个类,它有 10 个不同的自定义 init 方法(每个方法都从该类返回一个不同配置的对象)。其中大多数设置了该项目的一组独特的属性。
然而,所有这些自定义 init 方法都设置了 _foo = @"bar";
.. 那么我们可以将 _foo = @"bar"
移动到常规 init 中吗?保证它会被调用吗?或者我们所有的自定义 init 方法都必须自己调用 [super init]
吗?
我想不出为什么如果他们调用[self init]
会很糟糕,因为它反过来又调用[super init]
。如果这在某种程度上是不可取的,您能解释一下原因吗?
即在下面的示例中,在 initSalesReceiptWithTicket 中调用 [self init]
是否安全:
- (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;
}
最佳答案
是的,就是这样做的。更准确地说,应该有一个其他初始化器调用的指定初始化器。在您的示例中,普通的 -init
是您的指定初始化程序。
请参阅“多个初始化程序和指定初始化程序”:https://developer.apple.com/library/content/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW3
关于objective-c - 只要 init 调用 [super init],在 Objective C 自定义 init 方法中调用 [self init] 就可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370852/