2009-09-28 3 views
1

내 응용 프로그램이이 오류로 인해 충돌하는 이유가 혼동 스럽습니다.CGContextSetFillColorWithColor 오류 (EXC_BAD_ACCESS)

displayLayer 메서드 (CALayer 렌더링 용)를 구현했습니다. 이 메서드를 처음 실행하면 정상적으로 작동합니다. 그러나 이에 대한 후속 호출은 오류가 발생한 시점입니다.

self.bgColor가 컨텍스트 채우기 색으로 설정되면 오류가 발생하는 것 같습니다. 흥미롭게도 ... 그 라인 바로 앞에 bgColor를 만들면 모든 것이 작동합니다. 그러나 그대로,이 클래스 (displayLayer 메서드의 컨테이너)의 초기화시 bgColor가 생성됩니다.

@interface { 
    .... 
    UIColor *bgColor; 
    .... 
} 
@property (nonatomic, retain) UIColor *bgColor; 
... 
@end 

@implementation 
@synthesize bgColor; 
- (id)init { 
    ... 
    self.bgColor = [UIColor blackColor]; 
    ... 
} 
-(void)displayLayer:(CALayer *)caLayer { 
    ... 
    CGContextSetFillColorWithColor(context, self.bgColor.CGColor); 
    ... 
} 
... 
@end 

[UIColor blackColor는, 오토 릴리즈 객체를 반환 :

-(void)displayLayer:(CALayer *)caLayer 
{ 
    UIGraphicsBeginImageContext(caLayer.frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext();  
    CGContextSetFillColorWithColor(context, self.bgColor); 
    CGContextFillRect(context, CGRectMake(0, 0, 320, 25)); 
    [self drawText:context]; 
    // get image buffer 
    UIImage *imageBuffer = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    // set layer contents to image buffer 
    caLayer.contents = (id)[imageBuffer CGImage]; 
} 
+0

오, 세상에, scrunched 코드 스 니펫에 대해 유감스럽게 생각합니다 !! – AlvinfromDiaspar

+1

코드의 서식을 지정하려면 각 줄의 시작 부분에 4 개의 공백을 사용하거나 1과 0이 모두있는 단추를 사용하십시오. –

+0

어떻게 bgColor를 설정하고 있습니까? 코드 스 니펫을 올리시겠습니까? 나는 당신이 그것을 유지하지 않을 것으로 의심하고, autoreleased 색상을 사용합니다. displayLayer가 처음 호출 된 것은 아마도 같은 runloop에 있기 때문에 아직 색상이 출시되지 않았습니다. 그런 다음 runloop이 끝나고 bgColor가 해제되고 이후 displayLayer를 호출 할 때 내 헤더 파일에 EXC_BAD_ACCESS 오류 –

답변

5

내가 아직 많은 아이폰 프로그래밍을하지, 그리고 CGColor 인스턴스 변수를 사용 적이없는, 그래서 내가 무엇을 할 것이라고하는 것은 이것이다 그것을 유지하지 않고 인스턴스 변수에 할당했습니다.

init에서 bgColor 대신 self.bgColor를 사용하고 해당 값을 유지하도록 속성을 설정하면 색상이 유지되고 나중에 displayLayer에서 사용할 수 있습니다.

앞서 언급했듯이 CGColors를 직접 사용하는 데 경험이 없기 때문에 위의 코드에서 UIColor를 사용하고 있습니다. 필요에 따라 조정하십시오.

+0

흠 .... 자기를 사용하는 것과 사용하지 않는 것 사이의 모든 일은 내 마음 속에는 확실히 확고하지 않다. 하지만 방금 말한 것은 나에게 의미가 있습니다. 이미 CGColor 대신 UIColor *를 사용하도록 조정했습니다. 도움 주셔서 감사합니다. – AlvinfromDiaspar

+0

bcColor를 합성하면 두 개의 메서드가 생성됩니다. - (UIColor *) bgColor 및 - (void) setBgColor : (UIColor *) aColor ;. 이러한 메서드는 객체를 유지하고 해제하는 데 사용됩니다. self.bgColor = xxx를 사용하는 것은 [self setBgColor : xxx]를 호출하는 것과 동일하며 xxx = self.bgColor를 사용하는 것은 xxx = [self bgColor]를 호출하는 것과 동일하므로 모든 유지 및 해제가 처리됩니다. 인스턴스 변수를 직접 읽거나 수정하면 (자체없이) 인스턴스를 유지하고 해제해야합니다. –

+0

이 답변의 가장 좋은 점은 self.bgColor.CGColor를 사용하여 UIColor IMHO의 CGColorRef 값을 가져 오는 것입니다. – HCdev