我将一些图形缓存到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在使用后是否需要手动释放?
由于
答案 0 :(得分:1)
NSValue不了解Core Foundation类型,因此它不会保留或释放CGLayer。 (@encode
d类型的字符串几乎只是告诉它有多大的值;它没有告诉它有关内存管理的任何信息。)
在完成图层和NSValue之前,不得释放图层。
或者,更好的是,只需将CGLayer放入数组中即可。出于内存管理的目的,所有Core Foundation对象都与NSObject兼容(discussed previously),其实际效果是可以将CF对象放入NSArrays中,反之亦然。由于CGLayers是CF对象,这意味着您可以将CGLayer放入数组中而不将其装入另一个对象中。