我正在为绘图工作CGlayers。我已经实现了绘图部分,用户将绘制的drawingView(画布)是动态的,我的意思是用户可以增加/减少drawingView(画布)的高度。
例如,默认大小- 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;
}因此,让我解释一下我在上面的代码中所做的事情,在增加大小之前,我正在创建一个具有大小的"*permanentDrawingLayer“,然后将previousDrawing从"newDrawingLayer__”转移到这个“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);
}在这里您可以看到,我用rectSize绘制newDrawingLayer,用newSize绘制permanetDrawingLayer,所以每当我在画布上画画时,如果用户增加了大小,newDrawingLayer就会画出来,用户做的任何事情都将在permanentDrawingLayer中完成。希望这是清楚的。
现在我的问题是
1)当我drawSomething并增加canvasSize时,内存达到10 my,所以如果我总是这样做,您可以想象,由于内存压力,我的应用程序终止的速度有多快。
2)我看到的是,如果我在函数- "IncreaseCanavasSize",中注释“permanentDrawingLayer = nil”行,那么内存就不会增加,但是如果我不这样做,那么当我下次画画时,就不会创建带有newSize的图层,我会得到重复的绘图。
所以我需要你的帮助
发布于 2014-03-19 13:00:13
您的permanentDrawingLayer是一个CGLayerRef,因此将其设置为空,不要释放它。在将CGLayerRelease(permanentDrawingLayer)设置为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:看起来像previous question中的方法-setCurrentDrawingLayer:。在-IncreaseCanavasSize中,您可以简单地将行permanentDrawingLayer = nil;替换为[self setPermanentDrawingLayer:NULL];,然后它将释放CGLayerRef并将其设置为NULL。
https://stackoverflow.com/questions/22500008
复制相似问题