10

ARC を使用した viewDidUnload で IBOutlet プロパティを null に設定する必要はありますか?

それでも次のコメントが生成されるためです。

// メイン ビューの保持されているサブビューを解放します。

4

3 に答える 3

13

アウトレットを削除する主な目的は、ビューがView Controllerからアンロードされている間に、サブビューにスーパービューがない場合に発生する可能性のあるゾンビ、リーク、および奇妙な状況を作成しないことでした。

現在、Xcode の最新バージョンでは、ビュー要素をヘッダー内またはプライベート宣言内にドラッグすると、自動的に Outlet が弱い (iOS>=5 をターゲット) に設定されます。また、おそらくこの場合は不要なviewDidUnloadメソッドが記述されます。 [self setYourOutlet:nil];、しかし良い習慣です。弱い参照を使用できないため、より低いio​​sesをターゲットにする必要があります。は良い習慣なので、常に使用することをお勧めします。

アップデート

誤解を避けるために答えを完成させたいと思います(iOS5についてのみ話します)がメインビューのサブビューである場合にのみ、IBがコンセントを弱いに設定することに注意してください。通常、View Controller からのビューを含む xib で発生します。

プログラムで、または別の xib で作成せずに、実行時に何らかの条件に基づいて 2 つのビューを交換する必要がある場合があります。たとえば、VC が所有するメイン ビューがあり、同じ xib で、その瞬間にスーパービューを持たない他の 2 つのビューを作成するとします。同じ手法でそれらを接続しようとすると、作成される参照は になりますstrong。実行時に、ビューをスーパービューに追加または削除するだけでビューを交換できるようになりましたviewDidUnload

于 2012-05-17T15:17:47.713 に答える
11

ここで Andrea の回答を拡張します (彼に賛成してください!)。なぜなら、UI コンポーネントだけを意味しない限り、答えは簡単ではないからです。その場合、それらはすべて弱いはずです。

IBOutlets は、定義したものです。使用する場合:

@property (nonatomic, strong) IBOutlet UIView *someView;

親ビュー/ウィンドウをアンロードするときは、これを nil にする必要があります。

もしあなたがそうするなら:

@property (nonatomic, weak) IBOutlet __weak UIView *someView;

自動ゼロ化されるため、変数を nil にする必要はありません。

どのようにゼロにするかは完全にあなた次第です。ARCの前に私は使用しました:

[someView_ release], someView_ = nil;

@synthesizeこれで、セッター (で作成) を使用するか、基礎となる ivar を直接設定する2 つのオプションがあります。結果は同じです。どちらの場合も、オブジェクトの有効期間修飾子は、オブジェクトが最終的に使用され、解放されることに注意します。

だから、先に進んでこれをしてください:

self.someView = nil

また

@synthesize someView = someView_;
...
someView_ = nil;
于 2012-05-17T16:10:55.680 に答える
2

強いとマークされた IBOutlets については、viewDidUnload でそれらを nil アウトしたいと考えています。

どうして:

メモリ不足の通知を受け取ると、現在表示されていないビューは、メモリを節約するために (viewDidUnload を呼び出して) 自分自身をアンロードすることがあります。アウトレットを無効にすることで、所有権を放棄し、それらを解放することができます。ビューが再度読み込まれると (再度表示されると)、アウトレットが再度セットアップされ、viewDidLoad が呼び出されます。

于 2012-05-17T16:23:27.673 に答える