内存问题与CGlayer

我正在绘制CGlayers。 我已经实现了绘图部分,用户绘制的drawingView(canvas)是dynamic的,我的意思是用户可以增加/减lessdrawingView(Canvas)的高度,

例如默认大小 – 500 * 200

当用户点击扩展button – 500 * 300

所以这里是我的function,当用户扩大canvas,

- (void)IncreaseCanavasSize { CGContextRef layerContext1 = CGLayerGetContext(permanentDrawingLayer ); CGContextDrawLayerInRect(layerContext1, rectSize, newDrawingLayer); rectSize = self.bounds; CGFloat scale = self.contentScaleFactor; CGRect bounds = CGRectMake(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale); CGLayerRef layer = CGLayerCreateWithContext(layerContext1, bounds.size, NULL); CGContextRef layerContext = CGLayerGetContext(layer); CGContextScaleCTM(layerContext, scale, scale); [self setNewDrawingLayer:layer]; CGLayerRelease(layer); CGContextDrawLayerInRect(layerContext, self.bounds, permanentDrawingLayer); permanentDrawingLayer = nil; } 

所以让我解释一下我在上面的代码中做了什么, 我在创build一个大小为newLayer之前,它是增加,然后从“* permanentDrawingLayer ”传递到这个“ newDrawingLayer ”,使“permanentDrawing” nil *

所以每当我绘制,我画到permanentDrawingLayer,这是我的drawRect方法

 - (void)drawRect:(CGRect)rect { if(permanentDrawingLayer == nil) { CGFloat scale = self.contentScaleFactor; CGRect bounds = CGRectMake(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale); CGLayerRef layer = CGLayerCreateWithContext(context, bounds.size, NULL); CGContextRef layerContext = CGLayerGetContext(layer); CGContextScaleCTM(layerContext, scale, scale); [self setPermanentDrawingLayer:layer]; CGLayerRelease(layer); } CGContextRef layerContext = CGLayerGetContext(permanentDrawingLayer); CGContextBeginPath(layerContext); CGContextAddPath(layerContext, mutablePath); CGContextSetLineWidth(layerContext, self.lineWidth); CGContextSetLineCap(layerContext, kCGLineCapRound); CGContextSetLineJoin(layerContext, kCGLineJoinRound); CGContextSetAllowsAntialiasing(layerContext, YES); CGContextSetShouldAntialias(layerContext, YES); CGContextSetStrokeColorWithColor(layerContext, self.lineColor.CGColor); CGContextSetFillColorWithColor(layerContext, self.lineColor.CGColor); CGContextSetBlendMode(layerContext,kCGBlendModeNormal); CGContextStrokePath(layerContext); CGContextDrawLayerInRect(context,rectSize, newDrawingLayer); CGContextDrawLayerInRect(context, self.bounds, permanentDrawingLayer); } 

在这里,你可以看到,我用newRerawSize绘制newDrawingLayer,用newSize绘制permanetDrawingLayer,所以每当我画一个canvas时,如果用户增加了尺寸,newDrawingLayer将绘制这个,并且在PermanentDrawingLayer中用户将做的新绘图。 希望是明确的。

这是我的问题

1)内存尖峰到10MB,当我绘制一些东西,并增加canvasSize,所以如果我做这个动作总是可以想象,我的应用程序将由于内存压力终止多快。

2)我看到的是,如果我在函数 – “ IncreaseCanavasSize ”注释行“ permanentDrawingLayer = nil ”,然后内存doesnt峰值,但如果我不这样做,那么当我下一次绘制,然后与newSize层将不会创build,我会得到重复的图纸。

所以我需要你的帮助

你的permanentDrawingLayer是一个CGLayerRef所以把它设置为NULL,不要释放它。 在将其设置为NULL之前,您需要调用CGLayerRelease(permanentDrawingLayer)

 - (void)IncreaseCanavasSize { CGContextRef layerContext1 = CGLayerGetContext(permanentDrawingLayer ); CGContextDrawLayerInRect(layerContext1, rectSize, newDrawingLayer); rectSize = self.bounds; CGFloat scale = self.contentScaleFactor; CGRect bounds = CGRectMake(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale); CGLayerRef layer = CGLayerCreateWithContext(layerContext1, bounds.size, NULL); CGContextRef layerContext = CGLayerGetContext(layer); CGContextScaleCTM(layerContext, scale, scale); [self setNewDrawingLayer:layer]; CGLayerRelease(layer); CGContextDrawLayerInRect(layerContext, self.bounds, permanentDrawingLayer); CGLayerRelease(permanentDrawingLayer); permanentDrawingLayer = NULL; } 

此外,如果您的方法-setPermanentDrawingLayer:看起来像您的上一个问题中的方法-setCurrentDrawingLayer:-IncreaseCanavasSize你可以简单的replace这行permanentDrawingLayer = nil;[self setPermanentDrawingLayer:NULL]; ,那么它将释放CGLayerRef并将其设置为NULL。