我将一些图形缓存到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是否可以为我跟踪图层数据?使用后,retriatedLayer是否需要手动释放?
谢谢
最佳答案
NSValue不了解Core Foundation类型,因此它不会保留或发布CGLayer。 (@encode
d类型字符串几乎只告诉它值的大小;它不告诉任何有关内存管理的信息。)
在完全完成图层和NSValue之前,不得释放图层。
或者,更好的是,只需将CGLayer放入阵列中。为了内存管理(discussed previously)的目的,所有Core Foundation对象都与NSObjects兼容,这具有实际效果,您可以将CF对象放入NSArrays中,反之亦然。由于CGLayers是CF对象,因此这意味着您可以将CGLayer放入数组中,而无需将其装在另一个对象中。
关于ios - NSValue中的CGLayerRef-何时调用keep()或release()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7220398/