【问题标题】:Is calling [self init] OK in Objective C custom init methods as long as init calls [super init]?只要init调用[super init],在Objective C自定义init方法中调用[self init]就可以了吗?
【发布时间】: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


    【解决方案1】:

    是的,就是这样做的。更准确地说,应该有一个其他初始化程序调用的指定初始化程序。在您的示例中,普通的 -init 是您的指定初始化程序。

    参见“多重初始化器和指定初始化器”:https://developer.apple.com/library/content/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW3

    【讨论】:

    • 谢谢乔恩。是的,如果我从头开始写这一切,我实际上更愿意使用一个抽象类,它包含我指定的类,但我只是想在最好的架构和修复别人可怕的意大利面条之间做一个很好的折衷代码混乱尽可能快:D
    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2012-11-22
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多