UILabel のようなものが xib ファイルにリンクされている場合、ビューの dealloc で解放する必要がありますか? 私が尋ねる理由は、私がそれを割り当てていないからです。例 (ヘッダー内):
IBOutlet UILabel *lblExample;
実装では:
....
[lblExample setText:@"whatever"];
....
-(void)dealloc{
[lblExample release];//?????????
}
UILabel のようなものが xib ファイルにリンクされている場合、ビューの dealloc で解放する必要がありますか? 私が尋ねる理由は、私がそれを割り当てていないからです。例 (ヘッダー内):
IBOutlet UILabel *lblExample;
実装では:
....
[lblExample setText:@"whatever"];
....
-(void)dealloc{
[lblExample release];//?????????
}
現在ベスト プラクティスと見なされている方法に従う場合は、set アクセサーでそれらを保持する必要があるため、アウトレット プロパティを解放する必要があります。
@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
このアプローチの利点は、メモリ管理のセマンティクスが明示的かつ明確になり、すべての nib ファイルのすべてのプラットフォームで一貫して機能することです。
注: 次のコメントは、3.0 より前の iOS にのみ適用されます。3.0 以降では、viewDidUnload のプロパティ値を単純に nil にする必要があります。
ただし、ここでの考慮事項の 1 つは、コントローラーがユーザー インターフェイスを破棄し、要求に応じて動的に再読み込みする可能性がある場合です (たとえば、要求に応じて nib ファイルからビューを読み込むビュー コントローラーがある場合、メモリ不足など)。 -- ビューが再び必要になった場合にリロードできることを期待して、それを解放します)。この状況では、メイン ビューを破棄するときに、他のアウトレットの所有権も放棄して、それらも割り当て解除できるようにする必要があります。setView:
UIViewController の場合、次のようにオーバーライドすることでこの問題に対処できます。
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
残念ながら、これはさらなる問題を引き起こします。UIViewController は現在、 (単に変数を直接解放するのではなく) アクセサーdealloc
メソッドを使用してそのメソッドを実装しているため、メモリ警告への応答としてだけでなく、 で呼び出されます... これにより、 でクラッシュが発生します。setView:
self.anOutlet = nil
dealloc
dealloc
救済策は、アウトレット変数も in に設定されていることを確認することnil
ですdealloc
。
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}
Apple ドキュメントで探していたものを見つけました。つまり、オブジェクトを解放して保持するプロパティ (または @property、@synthesize のみ) として設定できますが、UILabels のようなものについてはその必要はありません。
の
[anOutlet release], anOutlet = nil;
setView: を正しく記述していれば、この部分はまったく不要です。
dealloc で解放しないと、メモリ フットプリントが増加します。
NibのメインビューのサブビューであるIBOutletは、オブジェクトの作成時に自動解放メッセージが送信されるため、解放する必要はありません。Deallocでリリースする必要があるIBOutletは、コントローラーや他のNSObjectなどのトップレベルオブジェクトのみです。これはすべて、上記にリンクされているAppleのドキュメントに記載されています。
IBOutlet をプロパティとしてではなく単にインスタンス変数として設定する場合でも、それを解放する必要があります。これは、initWithNib 時にすべての IBOutlets にメモリが割り当てられるためです。したがって、これは、コードでメモリを保持または割り当てていなくても、解放する必要がある特別なケースの 1 つです。
IB でラベルを作成することにより、ある意味でラベルを割り当てます。
IB が行うことは、IBOutlets とそれらがどのように定義されているかを確認することです。IB が何らかのオブジェクトへの参照を割り当てるクラス変数がある場合、IB はそのオブジェクトに保持メッセージを送信します。
プロパティを使用している場合、IB は値を設定する必要があるプロパティを使用し、値を明示的に保持しません。したがって、通常は IBOutlet プロパティを保持としてマークします。
@property (nonatomic, retain) UILabel *lblExample;
したがって、エーテルの場合 (プロパティを使用するかどうかに関係なく)、dealloc で release を呼び出す必要があります。