NSValue中的CGLayerRef - 何时调用retain()或release()?

时间:2011-08-28 10:36:59

标签: ios memory-management core-graphics release-management cglayer

我将一些图形缓存到CGLayers上,然后使用@encode将它们存储在NSValue对象中(以便将它们存储在一个数组中)。我只是想确保我正确处理保留/释放......

我缓存图形并将它们存储在数组中:

// 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?

我是否正确地假设图层在添加到数组后需要释放(第一个代码片段中的最后一行)?我认为这是因为我在代码中先前调用了一个create函数。那么NSValue会跟踪我的图层数据吗? retrieveLayer在使用后是否需要手动释放?

由于

1 个答案:

答案 0 :(得分:1)

NSValue不了解Core Foundation类型,因此它不会保留或释放CGLayer。 (@encode d类型的字符串几乎只是告诉它有多大的值;它没有告诉它有关内存管理的任何信息。)

在完成图层和NSValue之前,不得释放图层。

或者,更好的是,只需将CGLayer放入数组中即可。出于内存管理的目的,所有Core Foundation对象都与NSObject兼容(discussed previously),其实际效果是可以将CF对象放入NSArrays中,反之亦然。由于CGLayers是CF对象,这意味着您可以将CGLayer放入数组中而不将其装入另一个对象中。