Ios 从超级层删除会在一段时间后使应用程序崩溃
您好,我正在使用Ios 从超级层删除会在一段时间后使应用程序崩溃,ios,objective-c,core-animation,calayer,Ios,Objective C,Core Animation,Calayer,您好,我正在使用CAShapeLayer和CGPath。我正在绘制拼图并添加到滚动视图中。我按下了重新加载按钮以检查性能。重新加载时,我将从scrollview中删除所有以前的层。过了一段时间,它就崩溃了 僵尸告诉我移除图层的原因,这就是问题所在。代码中有什么错误吗? 这是: NSArray* layerArray = [[self.scrollView.layer sublayers]copy]; for (int i = 0; i < layerArray.count; i+
CAShapeLayer
和CGPath
。我正在绘制拼图并添加到滚动视图中
。我按下了重新加载按钮以检查性能。重新加载时,我将从scrollview
中删除所有以前的层。过了一段时间,它就崩溃了
僵尸告诉我移除图层的原因,这就是问题所在。代码中有什么错误吗?
这是:
NSArray* layerArray = [[self.scrollView.layer sublayers]copy];
for (int i = 0; i < layerArray.count; i++) {
A3JigsawView* aJigsawView = [layerArray objectAtIndex:i];
[aJigsawView removeFromSuperlayer];
}
self.scrollView.layer.sublayers = nil;
prevWidth = 0;
prevHeight = 0;
NSArray*layerArray=[[self.scrollView.layer sublayers]复制];
对于(int i=0;i
请帮帮我。谢谢。这是self.scrollView.layer.sublayers=nil。不分青红皂白地删除所有子层会导致iOS 7中的严重崩溃,这可能会在程序执行的更晚时间发生。我已经使用
rootLayer.sublayers=nil
和[rootLayer.sublayers-makeObjectsPerformSelector:@selector(removeFromSuperlayer)]
对其进行了彻底测试。一定有一个系统创建的层被搞砸了
您必须保留自己的图层阵列,并自己删除它们:
[myArrayOfLayersIAddedMyself makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
它是self.scrollView.layer.sublayers=nil。不分青红皂白地删除所有子层会导致iOS 7中的严重崩溃,这可能会在程序执行的更晚时间发生。我已经使用
rootLayer.sublayers=nil
和[rootLayer.sublayers-makeObjectsPerformSelector:@selector(removeFromSuperlayer)]
对其进行了彻底测试。一定有一个系统创建的层被搞砸了
您必须保留自己的图层阵列,并自己删除它们:
[myArrayOfLayersIAddedMyself makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
我们需要跟踪在各自视图上绘制的图层。 例如: NSMutableArray*CashapeLayer列表
UIBezierPath *pathToDraw = [UIBezierPath bezierPath];
[pathToDraw moveToPoint:startPoint];
[pathToDraw addLineToPoint:endPoint];
[pathToDraw stroke];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [pathToDraw CGPath];
shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
[self. listOfCAShapeLayer addObject:shapeLayer];
[self.imageView.layer addSublayer:shapeLayer];
现在我们的CAShapeLayer保存在数组self中。卡沙佩尔酒店
我们可以在任何需要擦除功能的地方检查条件
比如:
布尔-比瑟拉斯;
如果(bISErase==YES),则执行以下操作:
[self. listOfCAShapeLayer enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
CAShapeLayer *sl = obj;
[sl removeFromSuperlayer];
}])
我希望这对您现在有所帮助。我们需要跟踪在各自视图上绘制的图层。 例如: NSMutableArray*CashapeLayer列表
UIBezierPath *pathToDraw = [UIBezierPath bezierPath];
[pathToDraw moveToPoint:startPoint];
[pathToDraw addLineToPoint:endPoint];
[pathToDraw stroke];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [pathToDraw CGPath];
shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
[self. listOfCAShapeLayer addObject:shapeLayer];
[self.imageView.layer addSublayer:shapeLayer];
现在我们的CAShapeLayer保存在数组self中。卡沙佩尔酒店
我们可以在任何需要擦除功能的地方检查条件
比如:
布尔-比瑟拉斯;
如果(bISErase==YES),则执行以下操作:
[self. listOfCAShapeLayer enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
CAShapeLayer *sl = obj;
[sl removeFromSuperlayer];
}])
我希望这对您现在有所帮助。当应用程序崩溃时,您能附上堆栈日志吗?它没有显示任何内容…好的,除了。。。因此,我会检查主线程中是否完成了所有操作,也许您可以尝试在重新加载之前在主队列中分派此代码,您可能希望释放子层的副本:
layerArray=nil代码>假设在代码显示后立即再次添加层。不知道这样是否行,因为LayerRay会在你的方法退出后被释放-假设你使用的是ARC。你能在应用程序崩溃时附加堆栈日志吗?它没有显示任何东西…好的,除了。。。因此,我会检查主线程中是否完成了所有操作,也许您可以尝试在重新加载之前在主队列中分派此代码,您可能希望释放子层的副本:layerArray=nil代码>假设在代码显示后立即再次添加层。不知道这样做是否可行,因为在方法退出后,LayerRay将被释放——假设您使用的是ARC。