我将一些图形缓存到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/

10-11 08:03