1

Apple 建议不要在初始化程序中使用属性方法,但是如果您需要从初始化程序调用方法,并且还需要在对象初始化后从程序中的其他位置调用该方法,我不确定要遵循的协议。例如,您有:

- (id) init
{
    self = [super init];

    if (self)
    {
           [self someMethod];
    }

    return self;

}

- (void) someMethod
{
    _x = 0; \\ or self.x = 0 when this method is not called from initializer
}

someMethod其中包含一堆 ivars。问题是,它还需要在对象初始化后稍后在代码中的其他位置调用。我希望从那里调用访问器时不要在初始化程序中访问它,但我也希望在someMethod从其他地方调用它们时访问它们。有没有一种巧妙的方法来解决这种模式?使用时NSObject?使用时UIView?使用时UIViewController

4

1 回答 1

4

要判断忽略该建议是否安全,您必须了解此建议存在的原因。
主要问题是具有副作用的 getter 和 setter,因为它们基于实例变量执行计算,而这些实例变量在您调用 setter(或 getter)时可能未初始化。

以以下代码为例:

- (id)init {
    self = [super init];
    if (self) {
        // don't do this
        self.textColor = [UIColor blackColor];
        self.font = [UIFont boldSystemFontOfSize:17];

        // do this:
        _textColor = [UIColor blackColor];
        _font = [UIFont boldSystemFontOfSize:17];
        [self createLayers];
    }
    return self;
}

- (void)setFont:(UIFont *)font {
    if (font) {
        _font = font;
        [self createLayers];
    }
}

- (void)setTextColor:(UIColor *)textColor {
    if (textColor) {
        _textColor = textColor;
        [self createLayers];
    }
}

- (void)createLayers {
    // calculation that will crash if font or textColor is not set
}

因为如果 textColor 或 font 为 nil,createLayers 会崩溃,因此在 init 中使用 setter 会使您的代码崩溃。

于 2013-03-18T07:58:49.163 回答