1

我正在使用 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,它的大小在增加之前,然后将 previousDrawing 从“* PermanentDrawingLayer ”转移到这个“ 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)当我drawSomething并增加canvasSize时,内存峰值达到10MB,所以如果我总是这样做,你可以想象,我的应用程序由于内存压力而终止的速度有多快。

2)我看到的是,如果我在函数-“ IncreaseCanavasSize ”中评论“ PermanentDrawingLayer = nil ”行,那么内存不会飙升,但如果我不这样做,那么当我下次绘制时,带有 newSize 的图层将不会创建,我会得到重复的图纸。

所以我需要你的帮助

4

1 回答 1

1

permanentDrawingLayerCGLayerRef这样设置它为NULL,不要释放它。您需要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:看起来像-setCurrentDrawingLayer:之前问题中的方法。在-IncreaseCanavasSize您可以简单地用 替换该行permanentDrawingLayer = nil;[self setPermanentDrawingLayer:NULL];然后它将释放 CGLayerRef 并将其设置为 NULL。

于 2014-03-19T13:00:13.667 回答