CGLayerRef在NSValue – 什么时候调用retain()或release()?

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

我cachinggraphics并将它们存储在数组中,如下所示:

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

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

谢谢

NSValue不知道Core Foundationtypes,所以它不会保留或释放CGLayer。 ( @encode dtypes的string几乎告诉它值有多大,它没有告诉它关于内存pipe理的任何事情。)

直到完全使用图层和NSValue,才能释放图层。

或者,更好的办法就是把CGLayer放到数组中。 所有Core Foundation对象都与NSObjects兼容,用于内存pipe理( 前面已经讨论过 ),具有实际效果,可以将CF对象放入NSArrays中,反之亦然。 由于CGLayers是CF对象,这意味着您可以将CGLayer放入数组中,而不用将其装入另一个对象中。