问题描述
我正在使用CGlayers进行绘图.我已经实现了绘图部分,用户将在其中绘制的drawingView(canvas)是动态的,我的意思是,用户可以增加/减小drawingView(Canvas)的高度
I am working CGlayers for drawing. I have implemented the drawing part, the drawingView(canvas) where the user will draw is dynamic, what I mean by this is, user can increase/decrease height of the drawingView(Canvas)
例如默认大小-500 * 200
For example by default size - 500*200
当用户单击展开按钮时-500 * 300
When user clicks on expand button - 500*300
这是用户展开画布时的功能,
So here is my function when user expands the 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;
}
所以,让我解释一下上面代码中的操作,我正在创建一个尺寸更大的newLayer,然后再将其从"* permanentDrawingLayer "转移到" newDrawingLayer "并制作"permanentDrawing" 无 *
So let me explain what I am doing in the above code, I am creating a newLayer with size before it is increased, and then transfer the previousDrawing from "*permanentDrawingLayer" to this "newDrawingLayer" and making "permanentDrawing" nil*
所以每当我绘制时,我都会绘制到永久绘图层中,这是我的drawRect方法
So Whenever I draw, I draw into permanentDrawingLayer, here is my drawRect method
- (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都会绘制它,并且无论用户执行什么操作都将绘制新图在永久绘图层中.希望一切都清楚.
Here you can see, I draw newDrawingLayer with rectSize, and permanetDrawingLayer with newSize, So whenever, I draw on a canvas, if user has increased the size, the newDrawingLayer will draw that, and new drawing whatever user does will be done in permanentDrawingLayer. Hope it is clear.
现在这是我的问题
1)当我drawSomething并增加canvasSize时,内存峰值达到10MB,因此如果您始终可以执行此操作,您可以想象,由于内存压力,我的应用程序终止的速度有多快.
1) Memory spikes to 10MB, when I drawSomething and increase the canvasSize, so if I do this action always you can imagine, how fast my app will terminate due to memory pressure.
2)我看到的是,如果我在函数-" IncreaseCanavasSize "中注释了行" permanentDrawingLayer = nil ",那么内存不会增加,但是如果我不这样做这样做,那么当我下次绘制时,将不会创建具有newSize的图层,并且将获得重复的图纸.
2) What I saw was if I comment the Line " permanentDrawingLayer = nil" in function - "IncreaseCanavasSize", then memory doesnt spikes up, but if I dont do that, then when I draw next time, then Layer with newSize will not be created and I will get duplicate drawings.
所以我需要你的所有帮助
So I need all your help
推荐答案
您的permanentDrawingLayer
是CGLayerRef
,因此将其设置为NULL时不要释放它.您需要先调用CGLayerRelease(permanentDrawingLayer)
,然后再将其设置为NULL.
Your permanentDrawingLayer
is a CGLayerRef
so setting it to NULL, don't release it.You need to call CGLayerRelease(permanentDrawingLayer)
before setting it to NULL.
- (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
中,您可以简单地将permanentDrawingLayer = nil;
行替换为[self setPermanentDrawingLayer:NULL];
,然后它将释放CGLayerRef并将其设置为NULL.
Also if your method -setPermanentDrawingLayer:
looks like the method -setCurrentDrawingLayer:
in your previous question.In -IncreaseCanavasSize
You can simply replace the line permanentDrawingLayer = nil;
with [self setPermanentDrawingLayer:NULL];
, then it will release the CGLayerRef and set it to NULL.
这篇关于CGlayer的内存问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!