2012-02-23 2 views
2

간헐적으로 충돌이 계속되는 앱에 몇 가지 문제가 있습니다. 아래의 코드는 받침 층으로 CATiledLayer와의 UIView에 있습니다CATitledLayer를 사용하는 간헐적 인 EXC_BAD_ACCESS 예외

- (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의 수를 많은 수로 설정했기 때문에 1000 개의 스레드가 타일을 생성하기 위해 호출되지만 오류를 유발하지는 않습니다. 어쨌든 당신이 저를 위해 정확히 오류를 발견했는지 알고 있습니까? 알고 있으면 좋을 것입니다. 간헐적 인 충돌 문제로 앱을 출시하는 것이 매우 불안합니다. –

+0

@Gaz_Edge - 수정하지 않고 문제가 원래 코드 그대로 그대로 해결 되었습니까? – sch

+0

롤 꽤 아닙니다 - 오늘 아침에 오류가 원래 코드와 함께 갔었지만 다시 돌아 왔습니다. 이제는 @synchronized를 사용하고 있으며 문제는 한번도 보지 못했습니다. 그러나 문제를 악화 시키려고 할 때 오류가 발생하지 않았다는 것은 이상한 일입니다. 오류가 어디 있는지 확실하게 알면 좋을 것입니까? –