我正在为CGlayers工作。我已经实现了绘图部分,用户将绘制的drawingView(canvas)是动态的,我的意思是,用户可以增加/减少drawingView(Canvas)的高度
例如,默认大小 - 500 * 200
当用户点击展开按钮 - 500 * 300
时所以这是我的功能,当用户展开画布时,
- (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;
}
所以,让我解释一下我在上面的代码中做了什么,我在创建一个newLayer之前增加了大小,然后从" * permanentDrawingLayer 传输previousDrawing "对此" newDrawingLayer "并制作" permanentDrawing"的零 的 *
所以每当我画画时,我都会画入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);
}
在这里你可以看到,我使用rectSize绘制newDrawingLayer,使用newSize绘制permanetDrawingLayer,所以每当我在画布上绘制时,如果用户增加了大小,newDrawingLayer将绘制它,并且无论用户做什么,新绘图都将完成在permanentDrawingLayer中。希望很清楚。
现在这是我的问题
1)内存峰值达到10MB,当我绘制一些东西并增加canvasSize时,所以如果我执行此操作总是可以想象,我的应用程序因内存压力而终止的速度有多快。
2)我看到的是如果我评论Line" permanentDrawingLayer = nil "在功能 - " IncreaseCanavasSize ",然后内存没有增加,但如果我不这样做,那么当我下次绘制时,那么将不会创建带有newSize的图层而且我会得到重复的图纸。
所以我需要你的帮助
答案 0 :(得分:1)
您的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:
看起来像previous question中的方法-setCurrentDrawingLayer:
。
在-IncreaseCanavasSize
您可以简单地将行permanentDrawingLayer = nil;
替换为[self setPermanentDrawingLayer:NULL];
,然后它将释放CGLayerRef并将其设置为NULL。