50

簡単な質問。

同じ名前で宣言されたプロパティとivarがある場合:

.hファイル内:

(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;

.mファイルで、ARCを使用している場合、initメソッドでivarまたはプロパティを使用する必要がありますか?

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        reminder = reminder_;
    }
    return self;
}

または、このプロパティを使用して、次のように自動参照カウントを利用する必要があります。

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        self.reminder = reminder_;
    }
    return self;
}

オブジェクトの初期化のどの時点で、ドット表記を使用してプロパティにアクセスできるようになるかはわかりません。

4

3 に答える 3

68

ARCに関係なく、部分的に構築された状態で直接アクセスを使用します。

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        reminder = reminder_;
        // OR
        reminder = [reminder_ retain];
    }
    return self;
}

これはself.whatever、Key-Value Observing(KVO)通知などの他の副作用をトリガーしたり、クラスが(明示的に)実装したり、サブクラスをオーバーライドしたりするためsetWhatever:です。これにより、部分的に初期化されたインスタンスが他のAPI(独自のAPIを含む)に公開される可能性があります。 、これは、完全に構築されたオブジェクトを処理していることを正しく想定しています。

クラスが部分的に初期化された状態で動作できることを手動で確認できますが、それは多くのメンテナンスを必要とし、他の人がクラスをサブクラス化する場合は(率直に言って)非現実的または不可能です。これには多くの時間とメンテナンスが必要であり、特にこのアプローチを慣例として使用しようとする場合は、実質的なメリットはありません。

したがって、正確性を保証する統一された方法は、部分的に構築された状態で直接アクセスを使用し、アクセサーの使用を避けることです。

注:初期化は全体像の半分にすぎないため、「部分的に構築された」を使用しています。-dealloc同様の警告があります。

部分的に構築された状態(ARC || MRC)で直接アクセスを使用する必要がある理由の詳細については、次を参照してください:プロパティの初期化、ドット表記

于 2011-11-08T19:50:57.990 に答える
5

いいえ、すべきではありません!

理由の説明はここ
にあります また、アップルはそれをしないことをお勧めします。ここを読む

于 2014-03-20T08:49:09.653 に答える
0

オブジェクトの初期化のどの時点で、ドット表記を使用してプロパティにアクセスできるようになるかはわかりません。

ドット表記はまだObjective-Cメソッド(および実際にはObjCメソッドの下のCメソッド)であるため、ドット表記、またはメソッドの呼び出しは、メソッドがメモリ内の基になるタイプを処理する準備ができている場合、完全に安全です。それらがたまたまどのような状態にあるかに関係なく、初期化されていない(おそらく)ガレージメモリセグメントの使用を回避することに関する通常のルールが引き続き適用されます。これは、initでivarを使用するための最も強い動機です。

ただし、メソッド(getter | setter)がメモリセグメントを正しく使用できる場合(読み取られる前に最初に書き込まれるかどうかに関係なく)、必ずinitメソッドでgetterを使用してください。レイジーゲッターは、初期化するポインターが「nil」として開始するという仮定を利用して、初期化の実行を決定します。メモリの初期内容を想定できない場合は、ivarを初期化するのが最も安全な方法かもしれません。

メソッドがこのシナリオで正しく動作できる場合、initでセッターまたはゲッターを使用しないというルールがあるのはなぜですか?

于 2015-10-30T21:04:45.020 に答える