2012-02-10 2 views
1

- (void)deallocの方法で〜nilと宣言されたretain修飾子をすべて設定する必要がありますか?私がそうしなければ、メモリは消費/無駄になるでしょうか?iOS:dealloc&IBOutlet

自動参照カウントがオフになっているものとします。

+0

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) –

答えて

0

あなたの質問は「どうすれば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を使用してください。

1

IBOutlets-(void)deallocnilにする必要はありません。インストゥルメントでテストすると、IBOutletsに接続されているインターフェイス要素のメモリは、UIViewが割り当て解除されるとすぐに正常に解放されます。

しかし、あなたのアプリがスレッディングを使用している場合は、問題のオブジェクトがまだ利用可能かどうかを他のスレッドが簡単に判断できるようにすることが推奨されます。

関連する問題