この疑似コードを見てください:
void* magicpointer = malloc(OVER_NINE_THOUSAND);
NSValue* v = [NSValue valueWithPointer:magicpointer];
[v release];
v が解放されると、magicpointer も解放されますか、それとも手動で行う必要がありますか? 手動参照カウントを使用しています。
この疑似コードを見てください:
void* magicpointer = malloc(OVER_NINE_THOUSAND);
NSValue* v = [NSValue valueWithPointer:magicpointer];
[v release];
v が解放されると、magicpointer も解放されますか、それとも手動で行う必要がありますか? 手動参照カウントを使用しています。
解放されません-NSValueは単なるラッパーであるため、任意の値をオブジェクトとして扱うことができます。ラップされたポインタでは何もしません。
いいえ、しませNSValue
ん。
を使用したいと思うかもしれませんがNSData
、解放されたときにポインターを解放できます。
void* magicpointer = malloc(OVER_NINE_THOUSAND); NSData *d = [NSData dataWithBytesNoCopy:magicpointer 長さ:OVER_NINE_THOUSAND freeWhenDone:YES]; //d は自動解放されるため、解放する必要はありません。
NSValueが解放されても、NSValueはポインターを解放しません。NSValueに格納されているポインタについてドキュメントに記載されているのは次のとおりです。
割り当てられたデータ項目を使用してNSValueオブジェクトを作成する場合は、NSValueオブジェクトが存在する間はそのメモリの割り当てを解除しないでください。
NSValueを使用する主な理由は、オブジェクトのみを受け入れるNSArrayまたは同様のコレクションに値を配置できるように値をボックス化することです。NSValueボックスが不要になったという理由だけで、メモリを解放しても意味がありません。