2012-08-24 12 views
6

私はiPhoneの開発には初めてです。私は自分のプロジェクトにARCを使用しています。私がARCを使って理解している限り、手動でオブジェクトをリリースする必要はありません。しかし、私はいくつかの場所で、人々が明示的にオブジェクトをARCを使用した後でもViewDidUnloadに設定していないことを確認しました。次のようにARCの下の-viewDidUnloadの弱い、強い特性

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet; 
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar; 
@property (strong,nonatomic) NSMutableArray *dataArray; 

そして.M:

- (void)viewDidUnload 
{ 
    [self setMapViewOutlet:nil]; 
    [self setToolBar:nil]; 
    [super viewDidUnload]; 
    self.dataArray=nil; 
} 

私の質問があり、明示的にnilを指定することが本当に必要である、

は例えば、.hファイルに私はこのような何かを持っていますARCの下でもViewDidUnload?

答えて

10

viewDidUnloadメソッドの全体的なポイントは、メモリを解放するために、必要のないデータを解放することです。 the documentationを読む:

メモリ不足の状態が発生すると、現在のView Controllerの ビューが必要とされていない場合は、システムは メモリからこれらのビューを削除することを選ぶことができます。このメソッドは、ビューコントローラのビューに が解放された後に呼び出され、最終的なクリーンアップを実行する機会です。 ビューコントローラがビューへの個別の参照またはサブビューの サブビューを格納する場合、このメソッドを使用してこれらの参照を解放する必要があります。 は、ビューをサポートするために作成した のオブジェクトへの参照を削除するのに、このメソッドを使用することもできますが、ビューがなくなったのでもう不要です。このメソッドを使用してユーザーデータを解放したり、簡単に再作成できないその他の情報を に使用しないでください。

だから、今をオブジェクトを解放し、いくつかのメモリを解放するシステムを支援するために、nilにプロパティを設定しています。しかしもちろん、これはプロパティの種類に依存します。強いプロパティは「あなたのもの」で、今すぐに解放するかどうかを決定することができます(nilに設定します)。弱いプロパティは、すでにnilである可能性があります。たとえば、メインビューで解放されたビューを指している場合などです。そしてunsafe_unretainedのプロパティは特別な獣です。彼らが指しているオブジェクトは既にリリースされているかもしれませんが、それは自動的にnilに設定されたわけではありません。したがって、「安全な」プロパティタイプ(強/弱)のいずれかを使用するか、安全でないプロパティをnilに設定して、後でリリースされたオブジェクトを使用しないようにする必要があります。この場合、厳しいルールはありません。状況について考えなければならず、さまざまなプロパティの意味を考えなければなりません。

ところで、viewDidUnloadは、iOS 6では推奨されなくなりました。ここでは、メモリ不足の状態でもビューが解放されていません。まだdidReceiveMemoryWarningコールバックを受信して​​いるので、必要に応じていくつかのリソースをリリースすることができます。繰り返しますが、ドキュメンテーションを読み、いくつかのテストを実行して何が起こるかを見て、何をすべきかを決めることをお勧めします。

+0

しかし、私がnilに設定しなくても、システムは自動的にARCのメモリを解放しますか? – Raj

+0

最終的には、はい。 ARCの下でリークを作成するのは難しいことです。あなたのアプリケーションがメモリ警告を受け取ったときに大きなメモリを解放することによってシステムを助けることができるかどうかは、あなたが決定することです。 – zoul

+0

私はこの答えを受け入れるだろう。 – Raj

2

あなたがunsafe_unretainedを使用している場合は、それは暗黙的にnilに割り当てられませんので、あなたはnilにそれを割り当てる必要がありますが、弱参照の場合は、それが可能になるで暗黙の参照を避けるために、unsafe_unretainedの場合はnilに代入する必要があります。

+0

でも私は同じと思った。しかし、私はいくつかの場所では、弱い参照がnilに設定されているのを見ました。私の質問では、nilに設定された強い参照さえも見ることができます。 – Raj

3

ARCは、オブジェクトへの強い参照を保持しないプロパティのみをリリースします。あなたのケースでは、これらはすべて強い参照であるため、明示的にnilに設定されていない限り保持されます。

viewDidUnload方法は、あなたのUIViewControllerがメモリから削除されていることを意味するものではありません、それは単にそのビューがメモリ(iOS Developer - ViewController lifecycle)から除去されることを意味します。

この場合、明示的にnilに設定されていない限り、UIViewControllerはメモリ内に残るため、そのプロパティも保持されます。

+0

私の場合、それらはすべての強い参照ではありません。あなたの情報については、IOS4ではweakがサポートされていませんが、代わりにunsafe-unretainedを使用しています。機能は両方とも同じです – Raj

+0

正解、申し訳ありません弱いキーワードを探していました(現在はiOS5用に開発中です)。 – Resh32

+0

私が知っている限り、ARCは強力な参照のために自動的にdeallocを呼び出します。それを明示的にnilに設定する必要はありません。弱い参照はnilに設定しています。いくつかのケースで可能かもしれません – Raj

関連する問題