gpt4 book ai didi

ios - CGlayer 的内存问题

转载 作者:行者123 更新时间:2023-11-29 12:50:42 24 4
gpt4 key购买 nike

我正在使用 CGlayers 进行绘图。我已经实现了绘图部分,用户将在其中绘制的 drawingView(canvas) 是动态的,我的意思是,用户可以增加/减少 drawingView(Canvas) 的高度

例如默认尺寸 - 500*200

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

所以这是我在用户展开 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 传输 previousDrawing ”到这个“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,所以每当我在 Canvas 上绘制时,如果用户增加了尺寸,newDrawingLayer 将绘制它,并且无论用户做什么都会完成新绘制在永久绘图层中。希望清楚。

这是我的问题

1) 当我 drawSomething 并增加 canvasSize 时,内存峰值达到 10MB,所以如果我总是执行此操作,您可以想象,由于内存压力,我的应用程序将以多快的速度终止。

2) 我看到的是,如果我在函数中注释行“permanentDrawingLayer = nil”-“IncreaseCanavasSize”,那么内存不会激增,但如果我不这样做这样做,然后当我下次绘制时,将不会创建具有 newSize 的图层,我将得到重复的绘图。

所以我需要你的帮助

最佳答案

你的 permanentDrawingLayer 是一个 CGLayerRef 所以将它设置为 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。

关于ios - CGlayer 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com