首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGlayer的内存问题

CGlayer的内存问题
EN

Stack Overflow用户
提问于 2014-03-19 08:25:09
回答 1查看 312关注 0票数 1

我正在为绘图工作CGlayers。我已经实现了绘图部分,用户将绘制的drawingView(画布)是动态的,我的意思是用户可以增加/减少drawingView(画布)的高度。

例如,默认大小- 500*200

当用户单击展开按钮- 500*300

这是我的函数当用户展开画布时,

代码语言:javascript
复制
- (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方法

代码语言:javascript
复制
- (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的图层,我会得到重复的绘图。

所以我需要你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 13:00:13

您的permanentDrawingLayer是一个CGLayerRef,因此将其设置为空,不要释放它。在将CGLayerRelease(permanentDrawingLayer)设置为NULL之前,需要调用它。

代码语言:javascript
复制
- (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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22500008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档