objective-c - 只要 init 调用 [super init],在 Objective C 自定义 init 方法中调用 [self init] 就可以吗?

标签 objective-c

只要 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/

相关文章:

ios - 无法在沙箱外部为 THEOS Tweak 创建目录

ios - 如何在 iOS sdk 中的 UIButton 内添加边框?

iphone - 崩溃 [responseData setLength :0];

objective-c - 在 Objective-C 中获取返回对象的类

objective-c - Xcode 不断告诉我 NSDirectoryEnumerator 的使用是错误的。

ios - 如何继承 UICollectionView?

objective-c - objc 中的单例模式,如何保持 init 私有(private)?

ios - NSSet 上的核心数据一对多关系、分配、获取、谓词

objective-c - 非常奇怪的 UITableView tableFooterView 行为

iphone - 如何分配另一个对象指向单个对象?