6

私はiphone開発に不慣れです。プロジェクトに ARC を使用しています。私がARCを使用して理解している限り、オブジェクトを手動で解放する必要はありません。しかし、いくつかの場所で、ARC を使用した後でも、ViewDidUnload でオブジェクトを明示的に nil に設定していることに気づきました。

たとえば、.h ファイルには次のようなものがあります。

@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;
}

私の質問は、ARC でも ViewDidUnload で明示的に nil を指定することが本当に必要ですか?

4

3 に答える 3

10

このメソッドの要点は、viewDidUnloadメモリを解放するために、実際には必要のないデータを解放することです。ドキュメントを読む:

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

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

ちなみに、viewDidUnloadiOS 6 では非推奨になり、メモリ不足の状態でビューが解放されなくなりました。didReceiveMemoryWarning必要に応じていくつかのリソースを解放できるように、引き続きコールバックを受け取ります。繰り返しになりますが、ドキュメントを読み、いくつかのテストを実行して何が起こるかを確認し、何をすべきかを判断することをお勧めします。

于 2012-08-24T07:10:50.950 に答える
3

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

このviewDidUnloadメソッドは、あなたUIViewControllerがメモリから削除されることを意味するのではなく、単にそのビューがメモリから削除されることを意味します ( iOS 開発者 - ViewController ライフサイクル)。

この場合、UIViewController明示的に nil に設定されていない限り、メモリに残り、したがってそのプロパティも残ります。

于 2012-08-24T07:16:02.117 に答える
2

unsafe_unretained を使用している場合は、暗黙的に nil に割り当てられないため、nil に割り当てる必要があります。弱参照の場合は、暗黙的に nil に割り当てられます。したがって、ダングリング参照を避けるために、nil に割り当てる必要があります。 unsafe_unretained の場合。

于 2012-08-24T07:09:31.847 に答える