CGlayer的内存问题

时间:2014-03-19 08:25:09

标签: ios uikit core-graphics cglayer

我正在为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的图层而且我会得到重复的图纸。

所以我需要你的帮助

1 个答案:

答案 0 :(得分:1)

您的permanentDrawingLayerCGLayerRef,因此请将其设为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。