1

この疑似コードを見てください:

void* magicpointer = malloc(OVER_NINE_THOUSAND);
NSValue* v = [NSValue valueWithPointer:magicpointer];
[v release];

v が解放されると、magicpointer も解放されますか、それとも手動で行う必要がありますか? 手動参照カウントを使用しています。

4

3 に答える 3

5

解放されません-NSValueは単なるラッパーであるため、任意の値をオブジェクトとして扱うことができます。ラップされたポインタでは何もしません。

于 2012-04-13T06:20:31.533 に答える
5

いいえ、しませNSValueん。

を使用したいと思うかもしれませんがNSData、解放されたときにポインターを解放できます。

    void* magicpointer = malloc(OVER_NINE_THOUSAND);
    NSData *d = [NSData dataWithBytesNoCopy:magicpointer
                                     長さ:OVER_NINE_THOUSAND
                               freeWhenDone:YES];
    //d は自動解放されるため、解放する必要はありません。
于 2012-04-13T06:35:21.100 に答える
1

NSValueが解放されても、NSValueはポインターを解放しません。NSValueに格納されているポインタについてドキュメントに記載されているのは次のとおりです。

割り当てられたデータ項目を使用してNSValueオブジェクトを作成する場合は、NSValueオブジェクトが存在する間はそのメモリの割り当てを解除しないでください。

NSValueを使用する主な理由は、オブジェクトのみを受け入れるNSArrayまたは同様のコレクションに値を配置できるように値をボックス化することです。NSValueボックスが不要になったという理由だけで、メモリを解放しても意味がありません。

于 2012-04-13T06:27:42.967 に答える