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 в массив, не помещая его в другой объект.