- (void)dealloc
の方法で〜nil
と宣言されたretain
修飾子をすべて設定する必要がありますか?私がそうしなければ、メモリは消費/無駄になるでしょうか?iOS:dealloc&IBOutlet
自動参照カウントがオフになっているものとします。
- (void)dealloc
の方法で〜nil
と宣言されたretain
修飾子をすべて設定する必要がありますか?私がそうしなければ、メモリは消費/無駄になるでしょうか?iOS:dealloc&IBOutlet
自動参照カウントがオフになっているものとします。
あなたの質問は「どうすればdeallocのretain
プロパティを処理するのですか?さて、例を見てみましょう。
@property (retain, nonatomic) IBOutlet UIView *myView;
ビューをmyView
は、二つのオブジェクト、ビュー階層(内部addSubview:
または類似により)、(プロパティセッターメソッドによって)ビューコントローラによって保持されてロードされます。これを確認するには、単純なログだけが必要です。 viewDidLoad
にこのコードを配置することがありますが、このポインタに対処すべきである2つの方法があり、両方が自動的にXcode
によって自動的に入力されている2
NSLog(@"myLabel is retained: %i", myView.retainCount);
の出力でこれを確認します。
最初はviewDidUnload
(これは一般に低メモリの状況でのみ呼び出されます)では、ビューを解放したいと思っています。その結果、ダングリングポインタが発生するため、ポインタもnilに設定します。 Xcodeはsetterメソッドを使うだけでこれを実現します。
[self setMyView:nil];
最初にお聞きした場所はdealloc
です。 deallocでは、同じようにあなたのプロパティを解放する必要がありますが(問題のIBOutlet
に基づくメインスレッドのみの実行)、ぶら下がりポインタは問題ではありません。これは、Xcodeのdeallocの自動実装によって強化されたようです。全く有害ではないでしょうリリースに加えてnil
へのポインタを設定するもちろん
[myView release];
。これがメインスレッドでなければ、さらに好ましいかもしれませんUIKit
要素。しかし、マルチスレッドについて心配していた場合は、代わりにatomic
を使用してください。
IBOutlets
を-(void)dealloc
でnil
にする必要はありません。インストゥルメントでテストすると、IBOutlets
に接続されているインターフェイス要素のメモリは、UIView
が割り当て解除されるとすぐに正常に解放されます。
しかし、あなたのアプリがスレッディングを使用している場合は、問題のオブジェクトがまだ利用可能かどうかを他のスレッドが簡単に判断できるようにすることが推奨されます。
dealloc(たとえIOS 3.0の後であっても)の出力変数をnilに設定する必要がありますか?](http://stackoverflow.com/questions/5658535/is-it-required-to-set-outlets -varibles-to-nil-in-dealloc-even-after-ios-3-0) –