0

私は作成してメモリを割り当てたUITextFields全体を保持するNSMutableArrayを持っています。

私の viewDidUnload メソッドでは、このメモリを解放する必要があります。どうすればいいのですか?

for(int i = 0; i < [arr count]; i++){
    UITextField* txtField = [arr objectAtIndex i];
    txtField = nil;
}
arr = nil;

これは機能しますか?それとも arr = nil; を設定するだけですか?

私はARCを使用しているので、リリースしないでnilに設定します。

4

3 に答える 3

1

配列がView Controllerのインスタンス変数である場合、ARCを使用している限り、View Controllerがメモリを離れると自動的に割り当てが解除されます。

配列を手動で削除する必要がある場合は、nil に設定します。

arr = nil;

後で配列を再利用する必要がある場合は、配列を nil に設定してから再割り当てする必要があります。

配列がオブジェクトの @property であると仮定すると、getter で配列を割り当てるのが良い方法です。

-(NSMutableArray*)arr {
    if (!_arr) {
        _arr = [[NSMutableArray alloc] init];
    }
    return _arr;
}

このようにして、以前に nil に設定されていたとしても、配列にアクセスしようとすると常に配列を取得します。

于 2013-07-16T02:57:37.183 に答える
0

ARC を使用する場合は、 で行ったのと同じように変数を nil に設定して解放しますarr = nil。オブジェクトへのすべてのポインターが nil に設定されている場合にのみメモリが解放されることに注意してください。そのため、他の場所でそれらを保持していないことを確認してください。

didReceiveMemoryWarning第 2 に、 iOS 6 では viewDidUnload がサポートされなくなったため、メモリの問題が発生している場合は、メソッドでこれを処理する必要があります。

于 2013-07-16T02:56:21.253 に答える
0

何が起こるかを理解するためにコードが何をするか見てみましょう:

UITextField* txtField = [arr objectAtIndex i];

これは配列内の値のコピーNSMutableArrayを作成し、内の値は参照であり、その値を variable に格納しますtxtField。暗黙的に定義されているようtxtFieldに、強力な参照を保持するために、ARC は (最適化の対象となります) 参照に所有権を登録します (別名「保持」)。次の行:

txtField = nil;

nil 参照値を に格納しtxtFieldます。強力な参照を保持しているためtxtField、どのストアでも、ARC は変数に格納されている以前の参照値の所有権を放棄 (別名「リリース」) します。

配列は決して変更されません。その内容を反復処理し、各値をコピーし、その値を保持し、その値を解放しました。最後に次のように書きます。

arr = nil;

に nil 参照値を格納しarrます。強力な参照を保持しているためarr、どのストアでも ARC は変数に格納されている以前の参照値の所有権を放棄 (別名「リリース」) し、その以前の値は への参照でしたNSMutableArray。配列の所有者が他にいない場合、配列は破棄されます。配列が破棄されると、含まれるすべての値 (この場合はUITextFieldインスタンス) の所有権を放棄し、それらの所有者が他にいない場合、それらは破棄されます。 ...

したがって、ほとんどの場合、必要なのは次のとおりです。

arr = nil

しかし、あなたはそれを必要としないかもしれません. Asarrは、有効期間が終了したとき (ローカル変数の場合はその宣言を含むブロックまたはメソッドの終わり、インスタンス変数の場合はインスタンスが破棄されたとき) に強い参照を保持し、ARC はその所有権を放棄します。

HTH

于 2013-07-16T03:11:46.453 に答える