Прерывистое исключение EXC_BAD_ACCESS с CATitledLayer - PullRequest
2 голосов
/ 24 февраля 2012

У меня проблемы с приложением, которое периодически прерывается. Код ниже находится в UIView с CATiledLayer в качестве заднего слоя:

- (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 не может быть виноват?

1 Ответ

4 голосов
/ 24 февраля 2012

Попробуйте задать свойство path atomic.

Также вам, вероятно, следует изменить 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];
    }
}
...