CGLayerRef в NSValue - когда вызывать retain() или release()?

Я кэширую некоторую графику на CGLayers и затем сохраняю их в объектах NSValue, используя @encode (чтобы хранить их в массиве). Я просто хотел убедиться, что я правильно обработал сохранение / разблокировку...

Я кеширую графику и сохраняю ее в массиве примерно так:

// Create an NSMutableArray "newCache"
CGLayerRef drawingLayer = CGLayerCreateWithContext(context, bounds.size, NULL);
CGContextRef drawingContext = CGLayerGetContext(drawingLayer);

// Do some drawing...

[newCache addObject:[NSValue valueWithBytes:&drawingLayer objCType:@encode(CGLayerRef)]];
CGLayerRelease(drawingLayer);      // Is this release correct?

А потом я получаю слой:

CGLayerRef retrievedLayer;
[(NSValue *)[cacheArray objectAtIndex:index] getValue:&retrievedLayer];

// Use the layer...

// Should I release retrievedLayer here?

Правильно ли я предполагаю, что слой должен быть освобожден после добавления в массив (последняя строка в первом фрагменте кода)? Я предположил, что это так, так как я вызывал функцию создания ранее в коде. Тогда NSValue отслеживает данные слоя для меня? Нужно ли возвращать retrievedLayer вручную после использования?

Спасибо

1 ответ

Решение

NSValue не знает о типах Core Foundation, поэтому не будет сохранять или освобождать CGLayer. (The @encodeстрока типа d говорит о том, насколько велико значение; это ничего не говорит об управлении памятью.)

Вы не должны выпускать слой до тех пор, пока не закончите со слоем и NSValue.

Или, что еще лучше, просто поместите CGLayer в массив. Все объекты Core Foundation совместимы с NSObjects для целей управления памятью ( обсуждалось ранее), что имеет практический эффект, заключающийся в том, что вы можете помещать объекты CF в NSArrays и наоборот. Поскольку CGLayers являются объектами CF, это означает, что вы можете поместить CGLayer в массив, не помещая его в другой объект.

Другие вопросы по тегам