2012-04-13 1 views
1

Посмотрите на этот псевдокод:Предоставляет ли NSValue свою ценность при освобождении?

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

Когда v отпущена, делает magicpointer получить освобожден, как хорошо, или я должен сделать это вручную? Я использую ручной подсчет ссылок.

ответ

5

Он не освобождается - NSValue - это просто оболочка, поэтому вы можете рассматривать произвольные значения как объекты. Он не делает ничего с завернутым указателем.

1

NSValue не освобождает указатель при освобождении NSValue. Единственным, что документация говорит о указателе, хранимом в NSValue является:

Если вы создаете объект NSValue с выделенным элементом данных, не освободить свою память, пока объект NSValue существует.

Основная причина использования NSValue - присвоить значение, чтобы его можно было помещать в NSArray или подобную коллекцию, которая принимает только объекты. Не было бы смысла освобождать память просто потому, что поле NSValue больше не требуется.

5

Нет, NSValue не будет.

Похоже, вы можете захотеть использовать NSData, он может освободить это указатель, когда она выйдет:

 
    void* magicpointer = malloc(OVER_NINE_THOUSAND); 
    NSData *d = [NSData dataWithBytesNoCopy:magicpointer 
            length:OVER_NINE_THOUSAND 
           freeWhenDone:YES]; 
    //d is autoreleased, so no need to -release it. 
+0

Гораздо более полезный ответ, поскольку он вводит альтернативный способ, благодаря Vincent! –