2012-02-23 7 views
2

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

- (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. См. tech note. Моя проблема (я думаю), кажется, проблема с потоком. Неужели UIKit нельзя винить?

+0

Что происходит, когда вы пересчитывать тракту каждый раз, и никогда не храните его в переменной (которая может быть не поточно-)? – sch

+0

Это, похоже, сработало. Проблема только в том, как мне передать другой путь к моему drawRect? Мой пример был тривиализирован для легкого чтения, но моей программе необходимо установить свойство self.path, которое тогда нужно нарисовать –

ответ

4

Попробуйте сделать 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]; 
    } 
} 
+0

Это выглядит неплохо - спасибо. Только сейчас проблема заключается в том, что проблема, похоже, ушла с моей старой реализацией - это действительно запутанно. Ive пробовал различные вещи, чтобы сделать проблему хуже, то есть установить количество CATiles на большие числа, что означало бы, что 1000s потоков вызывается для создания фрагментов, но это, похоже, не вызывает ошибку. Так или иначе, вы знаете, что я точно нашел ошибку - было бы хорошо знать. Я очень нервничаю, выпуская приложение с скрытой проблемой прерывистого сбоя. –

+0

@Gaz_Edge. Проблема была решена с вашего исходного кода дословно, без каких-либо изменений? – sch

+0

lol не совсем - сегодня утром ошибка пошла с исходным кодом, но потом снова вернулась. Теперь я использую @synchronized и так как я не видел проблему один раз. Тем не менее, странно, что, когда я пытался сделать проблему хуже, я не видел ошибки. Было бы хорошо знать, где ошибка:/ –