【问题标题】:Objective-C: minimal init versus init that calls initWith?Objective-C:最小的 init 与调用 initWith 的 init?
【发布时间】:2018-05-16 16:53:21
【问题描述】:

大多数类中的方法 init 进行了最小化的初始化,因为如果您需要更复杂、更多的 has-a 相关行为,那么您需要使用 initWith 方法。那么为什么有人会从 init 方法中调用 initWith 呢?我见过这个,甚至在苹果的网站上也提到过,但它似乎隐藏了应该明确命名的行为。

【问题讨论】:

    标签: objective-c designated-initializer


    【解决方案1】:

    对象具有所谓的“指定初始化程序”,它们是(可以有多个)init... 方法,应该完全初始化和配置对象以供使用。

    UIView 为例,它指定的初始化器是initWithFrame:CGRect。这会用框架初始化视图(duh)。

    如果init 是指定的初始化器,它仍然必须定义一个框架,可能是CGRectZero,而initWithFrame: 必须调用init,然后是setFrame:,这意味着设置框架两次。我们不喜欢可以做两次的事情。

    这就是为什么在许多情况下init 被用作当其他初始化程序中的属性可以具有默认值(通常是某种零)时的快捷方式。在CGRect 的情况下,CGRectZero 是零值。

    另外,由于frameUIView 的一个重要属性,如果您指定的初始化程序是init,您会看到很多这样的:

    UIView *view = [[UIView alloc] init];
    view.frame = CGRectMake(0, 0, 20, 20)
    

    将这两行合二为一很有意义,这就是为什么initWithFrame: 是指定的初始化器。

    【讨论】:

    • 除了这些天框架直到很久以后才设置。
    • @JDD 你什么意思?如果你调用[[UIView alloc] init],它肯定会初始化frame
    • 并且只是仔细检查以防万一发生了更改,但-[UIView init] 像往常一样调用-[UIView initWithFrame:CGRectZero]。我们缺少什么吗? init 不做“最小初始化”。它确实完成了初始化(所有init 方法都可以)。它只是提供了更多的默认值。
    • 哎呀,我闻到一股气味。最佳实践是方法名称清晰完整地表示方法的作用。如果 Obj-C 的设计者认为这是个好主意,那他们就错了。想象一下,如果 init 也将背景设置为蓝色,但“init”本身并没有表明这一点。
    • 嗯?指定初始化程序的全部意义——应该总是被调用——是提供一组通用的默认值。如果 UIView 的作者已经决定默认背景应该是蓝色,那么应该在通过 -init 调用时设置(通过调用实际指定的初始化程序)。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多