57

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

これは正しいです?

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

4

2 に答える 2

71

変数の場合:

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

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

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

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

- (void)myMethod {
    myString = @"I'm setting my ivar directly";
}
@end
  • __strongこの ivar は、ARC コンパイラによって 扱われます。
  • nilオブジェクトの場合、または0プリミティブの場合に初期化されます。
于 2011-11-30T17:02:58.823 に答える
5

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

于 2011-10-20T12:56:34.403 に答える