【发布时间】:2016-02-12 19:36:33
【问题描述】:
只要 init 调用 [super init],在 Objective C 自定义 init 方法中调用 [self init] 就可以了吗?
即假设我们有一个类,它有 10 个不同的自定义 init 方法(每个方法从类返回一个不同配置的对象)。其中大多数设置了项目的一组独特属性。
然而,所有这些自定义初始化方法都设置了_foo = @"bar";.. 那么我们可以将_foo = @"bar" 移动到常规初始化中并保证它会被调用吗?还是我们所有的自定义初始化方法都必须自己调用[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;
}
【问题讨论】:
标签: objective-c