web-dev-qa-db-ja.com

ARC時代のプロパティとivar

変数の設定はデフォルトでstrong修飾子になっているため、ivarを設定すると、割り当てられているオブジェクトが保持されるようになったと理解しています。 ivarは宣言されたオブジェクトのスコープ内にあり、strongは変数のスコープ内にオブジェクトを保持するため、これは、ivarを含むオブジェクトがまだ存続している間はivar値が解放されないことを意味します。

これは正しいです?

もしそうなら、メモリ管理の観点から、保持(強力な)プロパティと単純なivarの間に違いはもうないと思うのは正しいですか?

57
Toastor

変数の場合:

  1. [〜#〜] arc [〜#〜] を使用してクラスで宣言されます。
  2. クラスの実装にのみ使用されます(クラスインターフェイスの一部として公開されません)。
  3. [〜#〜] kvo [〜#〜] は必要ありません。
  4. カスタムゲッター/セッターは必要ありません。

次に、対応する@property/@synthesizeのないivarとして宣言し、実装内で直接参照するのが適切です。クラス実装ファイルでこのivarを宣言することは、 Encapsulation とインラインです。

// MyClass.h
@interface MyClass : ParentClass
@end

// MyClass.m
@implementation MyClass {
    NSString *myString;
}

- (void)myMethod {
    myString = @"I'm setting my ivar directly";
}
@end
  • このivarは、ARCコンパイラによって__strongとして扱われます。
  • オブジェクトの場合はnilに初期化され、プリミティブの場合は0に初期化されます。
70
bearMountain

[〜#〜] kvo [〜#〜] を使用して、ARCを使用する場合と非常によく似ていることを除いて、インスタンス変数を使用してカスタムのゲッターとセッターを実行することはできません。

6
Mattias Wadman