Iphone CATitledLayer出现间歇性EXC\u坏访问异常

Iphone CATitledLayer出现间歇性EXC\u坏访问异常,iphone,objective-c,ios,cocoa-touch,catiledlayer,Iphone,Objective C,Ios,Cocoa Touch,Catiledlayer,我有一些问题的应用程序,不断崩溃间歇性。以下代码位于以CATiledLayer作为其背景层的UIView中: - (UIBezierPath *)path { if(_path == nil){ _path = [UIBezierPath bezierPath]; CGFloat lineWidth = 5; [_path setLineWidth:lineWidth]; [_path setLineJoinStyle:k

我有一些问题的应用程序,不断崩溃间歇性。以下代码位于以CATiledLayer作为其背景层的UIView中:

- (UIBezierPath *)path
{
    if(_path == nil){

        _path = [UIBezierPath bezierPath];
        CGFloat lineWidth = 5;
        [_path setLineWidth:lineWidth];
        [_path setLineJoinStyle:kCGLineJoinRound];
        [_path setLineCapStyle:kCGLineCapRound];       

        [_path moveToPoint:CGPointMake(100, 100)];      
        [_path addLineToPoint:CGPointMake(200,200)];
        [_path addLineToPoint:CGPointMake(150,200)];
        [_path addLineToPoint:CGPointMake(50,400)];
        _path closePath];

        return _path;
    }    
return _path;
}

- (void)drawRect:(CGRect)rect
{  
    [[UIColor colorWithRed:0.1 green:0.1 blue:1 alpha:0.45] setStroke];//sets stroke color in current context
    [self.path stroke];
}
我得到以下错误代码:

Single stepping until exit from function _ZN2CG4Path15apply_transformERK17CGAffineTransform, which has no line number information.
当错误发生时,似乎没有任何模式。它似乎可以在滚动或缩放时发生。有时,当我缩放/滚动时会崩溃。有时我可以缩放和滚动一段时间,直到它崩溃


我知道在iOS4之前,UIKit不是线程安全的,不能与CATiledLayers一起使用。看,我的问题(我认为)似乎是一个线程问题。当然不能怪UIKit吗?

试着让
路径
属性
原子化

此外,您可能应该将
drawRect
修改为以下内容:

- (void)drawRect:(CGRect)rect
{  
    [[UIColor colorWithRed:0.1 green:0.1 blue:1 alpha:0.45] setStroke];//sets stroke color in current context
    @synchronized(self) {
        [self.path stroke];
    }
}

尝试使
路径
属性
原子化

此外,您可能应该将
drawRect
修改为以下内容:

- (void)drawRect:(CGRect)rect
{  
    [[UIColor colorWithRed:0.1 green:0.1 blue:1 alpha:0.45] setStroke];//sets stroke color in current context
    @synchronized(self) {
        [self.path stroke];
    }
}

当您每次都重新计算路径并且从不将其存储在变量(可能是非线程安全的)上时会发生什么情况?这似乎已经起作用了。唯一的问题是如何将不同的路径传递到drawRect?为了便于阅读,我的示例被简化了,但我的程序需要设置self.path属性,然后需要将其绘制出来。每次重新计算路径时会发生什么情况,并且从不将其存储在变量上(这可能是非线程安全的)?这似乎起到了作用。唯一的问题是如何将不同的路径传递到drawRect?为了便于阅读,我的示例被简化了,但我的程序需要设置self.path属性,然后需要绘制该属性,这看起来是个好主意-谢谢。现在唯一的问题是,这个问题似乎已经随着我的旧实现而消失了——这真是令人困惑。我尝试了各种方法使问题变得更糟,例如将CATILE的数量设置为较大的数字,这意味着调用1000个线程来创建瓷砖,但这似乎不会触发错误。不管怎样,你知道我能准确地找到错误吗?很高兴知道。发布一个带有潜在间歇性崩溃的应用程序时,我感到非常紧张problem@Gaz_Edge-问题是用原始代码一字不差地解决的,没有任何修改吗?哈哈,不完全是-今天早上,错误已经随原始代码一起消失了,但是又回来了。所以我现在使用@synchronized,因为我一次也没有看到这个问题。然而,奇怪的是,当我试图让问题变得更糟时,却没有看到错误。最好确定错误在哪里/ism我猜多个线程正在试图同时访问视图和/或路径属性的CGContext。是的,我也是这么想的。这就是为什么我认为如果我能得到更多线程来调用上下文和路径(即设置一个小的tile大小16,16),错误会更频繁地出现,但事实似乎并非如此。无论如何,在过去的一个小时左右,使用@synchronization似乎已经解决了这个问题-谢谢!这看起来是个好主意-谢谢。现在唯一的问题是,这个问题似乎已经随着我的旧实现而消失了——这真是令人困惑。我尝试了各种方法使问题变得更糟,例如将CATILE的数量设置为较大的数字,这意味着调用1000个线程来创建瓷砖,但这似乎不会触发错误。不管怎样,你知道我能准确地找到错误吗?很高兴知道。发布一个带有潜在间歇性崩溃的应用程序时,我感到非常紧张problem@Gaz_Edge-问题是用原始代码一字不差地解决的,没有任何修改吗?哈哈,不完全是-今天早上,错误已经随原始代码一起消失了,但是又回来了。所以我现在使用@synchronized,因为我一次也没有看到这个问题。然而,奇怪的是,当我试图让问题变得更糟时,却没有看到错误。最好确定错误在哪里/ism我猜多个线程正在试图同时访问视图和/或路径属性的CGContext。是的,我也是这么想的。这就是为什么我认为如果我能得到更多线程来调用上下文和路径(即设置一个小的tile大小16,16),错误会更频繁地出现,但事实似乎并非如此。无论如何,在过去的一个小时左右,使用@synchronization似乎已经解决了这个问题-谢谢!