CGLayerRef в NSValue - когда вызывать retain () или release ()? - PullRequest
0 голосов
/ 28 августа 2011

Я кэширую некоторые графические объекты на 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 Ответ

1 голос
/ 28 августа 2011

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

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

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

...