【问题标题】:Objective-C - Correct init methodObjective-C - 正确的初始化方法
【发布时间】:2012-10-05 08:26:08
【问题描述】:

我已将UITableViewCell 子类化,在- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 中我正在设置一些实例变量,如下所示:

_image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]]

我没有使用任何访问器,因为 Apple 建议不要在 initdealloc 中使用访问器。

到目前为止一切顺利。我的问题是在我设置了 _image 之后,我想为图像设置 userInteractionEnabledYES。我应该使用 getter 还是直接使用 ivar?

self.image.userInteractionEnabled = YES;

或者

_image.userInteractionEnabled = YES;

首选哪种风格?

【问题讨论】:

    标签: objective-c cocoa init


    【解决方案1】:

    建议仍然成立:直接在 init 中使用 ivar。如果您曾经在该属性上实现自定义访问器(现在或以后,此处或子类化时),您可能会遇到麻烦。

    【讨论】:

      【解决方案2】:

      A third option:将图像分配给局部变量,使用该变量对其进行完全设置(例如,它的userInteractionEnabled),然后将其分配给局部变量中的实例变量。

      【讨论】:

        【解决方案3】:

        由于这是一个属性值,self.image... 更正确,它将确保所有通知都已发送,并且如果有其他任何东西正在观察该对象是否运行。如果您使用 _image... 则不会发送任何通知。

        【讨论】:

        • 这在 init 和 dealloc 中实际上是不好的做法,很容易导致错误。事实上,您不想为尚未完全初始化的对象触发任何事情
        • +1 到 @Eiko 并且在对象的生命周期中此时不应有任何观察者(self 可能除外,即使那样我也不认为你想要通知在半初始化时发出)。您必须执行obj = [Class alloc]; [obj addObserver...]; [obj init]; 之类的操作,在这种情况下,您最好还是不要收到通知。
        • 为什么要减分?我的回答是完全正确的,尽管有些人可能会说这是一种不好的做法,但我只是不同意。这不符合减分条件。
        猜你喜欢
        • 2023-03-21
        • 2015-05-17
        • 2011-08-20
        • 2010-11-02
        • 2019-10-24
        • 2019-10-03
        • 1970-01-01
        • 2023-04-01
        • 2021-11-22
        相关资源
        最近更新 更多