ARC を使用した viewDidUnload で IBOutlet プロパティを null に設定する必要はありますか?
それでも次のコメントが生成されるためです。
// メイン ビューの保持されているサブビューを解放します。
ARC を使用した viewDidUnload で IBOutlet プロパティを null に設定する必要はありますか?
それでも次のコメントが生成されるためです。
// メイン ビューの保持されているサブビューを解放します。
アウトレットを削除する主な目的は、ビューがView Controllerからアンロードされている間に、サブビューにスーパービューがない場合に発生する可能性のあるゾンビ、リーク、および奇妙な状況を作成しないことでした。
現在、Xcode の最新バージョンでは、ビュー要素をヘッダー内またはプライベート宣言内にドラッグすると、自動的に Outlet が弱い (iOS>=5 をターゲット) に設定されます。また、おそらくこの場合は不要なviewDidUnload
メソッドが記述されます。 [self setYourOutlet:nil];
、しかし良い習慣です。弱い参照を使用できないため、より低いiosesをターゲットにする必要があります。は良い習慣なので、常に使用することをお勧めします。
アップデート
誤解を避けるために答えを完成させたいと思います(iOS5についてのみ話します)がメインビューのサブビューである場合にのみ、IBがコンセントを弱いに設定することに注意してください。通常、View Controller からのビューを含む xib で発生します。
プログラムで、または別の xib で作成せずに、実行時に何らかの条件に基づいて 2 つのビューを交換する必要がある場合があります。たとえば、VC が所有するメイン ビューがあり、同じ xib で、その瞬間にスーパービューを持たない他の 2 つのビューを作成するとします。同じ手法でそれらを接続しようとすると、作成される参照は になりますstrong
。実行時に、ビューをスーパービューに追加または削除するだけでビューを交換できるようになりましたviewDidUnload
。
ここで 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;
強いとマークされた IBOutlets については、viewDidUnload でそれらを nil アウトしたいと考えています。
どうして:
メモリ不足の通知を受け取ると、現在表示されていないビューは、メモリを節約するために (viewDidUnload を呼び出して) 自分自身をアンロードすることがあります。アウトレットを無効にすることで、所有権を放棄し、それらを解放することができます。ビューが再度読み込まれると (再度表示されると)、アウトレットが再度セットアップされ、viewDidLoad が呼び出されます。