“ assign”で設定されたアウトレットをリリースする必要がないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/805892

質問

次のようなものがある場合は読んでいます:

@property (nonatomic, assign) UIView *anView;

その後、メモリ管理を気にする必要はありません。 -deallocメソッドで[anView release]を実行する必要はありません。

なぜ?

" assign"コンパイラーに次のように伝えます。「おい、このプロパティは誰が割り当てたものも保持しません」そして、あなたはそうすることができます

@synchronize anView;

そしてコンパイラーは魔法のようにゲッターとセッターを作成します。セッターは次のようになります。

- (UIView*) anView {
    return anView;
}

およびセッターは次のようになります:

- (void) setAnView:(UIView*)newAnView {
    anView = newAnView;
}

正しい/間違っている?それが正しければ、セッターは「保持」ではないため、newAnView変数の所有権を主張しません。プロパティ。それを取得して、インスタンス変数に割り当てます。そのため、所有権ポリシーを検討する場合、-deallocでanViewインスタンス変数を解放する必要はありません。オブジェクトはそれを所有していません。それは正しいですか?

役に立ちましたか?

解決

はい、基本的に正しいです。ガベージコレクターがオフになっていると仮定しましょう(そうでなければ、それはとにかく重要ではありません)。

「assign」プロパティを使用する場合、オブジェクトを保持することはないので、オブジェクトを解放する必要はありません(誰かの責任です)。

本質的に、これは弱い参照を作成します-プロパティがまだ参照している間にanViewの割り当てが解除される場合があります。通常、オブジェクトではなくプリミティブデータ型に「assign」を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top