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

推奨事項を無視しても安全かどうかを判断するには、この推奨事項が存在する理由を理解する必要があります。
主な問題は、セッター (またはゲッター) を呼び出したときに初期化されない可能性があるインスタンス変数に基づいて計算を実行するため、副作用を持つゲッターとセッターです。

次のコードを例にとります。

- (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
}

createLayers は textColor または font が nil の場合にクラッシュするため、init でセッターを使用するとコードがクラッシュします。

于 2013-03-18T07:58:49.163 に答える