4

내 응용 프로그램에서 사용하고있는 섀도우 테이블보기 클래스가 있습니다.ARC에서 연결된 CGColorRef를 비교할 때 왜 충돌이 발생합니까?

ARC로 변환 할 때 몇 가지 사항을 변경해야했습니다. 새로운 클래스에서는 다음 라인에 충돌합니다 : (id)(inverse ? darkColor : lightColor) to (__bridge id)(inverse ? lightColor : darkColor). 콘솔은 말한다 *** -[Not A Type retain]: message sent to deallocated instance 0x4cee70

전 :

- (CAGradientLayer *)shadowAsInverse:(BOOL)inverse 
{ 
    CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease]; 
    CGRect newShadowFrame = 
     CGRectMake(0, 0, self.frame.size.width, 
      inverse ? SHADOW_INVERSE_HEIGHT : SHADOW_HEIGHT); 
    newShadow.frame = newShadowFrame; 
    CGColorRef darkColor = 
     [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha: 
      inverse ? (SHADOW_INVERSE_HEIGHT/SHADOW_HEIGHT) * 0.25 : 0.25].CGColor; 
    CGColorRef lightColor = 
     [self.backgroundColor colorWithAlphaComponent:0.0].CGColor; 
    newShadow.colors = 
     [NSArray arrayWithObjects: 
      (id)(inverse ? lightColor : darkColor), 
      (id)(inverse ? darkColor : lightColor), 
     nil]; 
    return newShadow; 
} 

후 :

- (CAGradientLayer *)shadowAsInverse:(BOOL)inverse 
{ 
    CAGradientLayer *newShadow = [[CAGradientLayer alloc] init]; 
    CGRect newShadowFrame = 
     CGRectMake(0, 0, self.frame.size.width, 
      inverse ? SHADOW_INVERSE_HEIGHT : SHADOW_HEIGHT); 
    newShadow.frame = newShadowFrame; 
    CGColorRef darkColor = 
     [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha: 
      inverse ? (SHADOW_INVERSE_HEIGHT/SHADOW_HEIGHT) * 0.25 : 0.25].CGColor; 
    CGColorRef lightColor = 
     [self.backgroundColor colorWithAlphaComponent:0.0].CGColor; 
    newShadow.colors = 
     [NSArray arrayWithObjects: 
      (__bridge id)(inverse ? lightColor : darkColor), 
      (__bridge id)(inverse ? darkColor : lightColor), 
     nil]; 
    return newShadow; 
} 
+0

그림자 처리 된 테이블보기입니까? –

답변

8

애플의 Transitioning to ARC Release Notes는 제목의 하위 섹션으로 CAGradientLayer.colors을 사용, "컴파일러는 CF를 처리합니다 코코아 방법에서 반환 된 개체"했다 보기. , 엑스 코드에서

:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer]; 
     gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor], 
                 (id)[[UIColor lightGrayColor] CGColor], nil]; 
     gradientLayer.startPoint = CGPointMake(0.0, 0.0); 
     gradientLayer.endPoint = CGPointMake(1.0, 1.0); 
    } 
    return self; 
} 

그래서 어쩌면 당신은 다음과 같은 코드를 다시 작성하려고한다 : 나는 다른 방법으로이 문제를 해결

- (CAGradientLayer *)shadowAsInverse:(BOOL)inverse 
{ 
    CAGradientLayer *newShadow = [[CAGradientLayer alloc] init]; 
    CGRect newShadowFrame = 
     CGRectMake(0, 0, self.frame.size.width, 
      inverse ? SHADOW_INVERSE_HEIGHT : SHADOW_HEIGHT); 
    newShadow.frame = newShadowFrame; 
    UIColor darkColor = 
     [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha: 
      inverse ? (SHADOW_INVERSE_HEIGHT/SHADOW_HEIGHT) * 0.25 : 0.25]; 
    UIColor lightColor = 
     [self.backgroundColor colorWithAlphaComponent:0.0]; 
    newShadow.colors = inverse 
     ? [NSArray arrayWithObjects:[lightColor CGColor], [darkColor CGColor], nil] 
     : [NSArray arrayWithObjects:[darkColor CGColor], [lightColor CGColor], nil]; 
    return newShadow; 
} 
+1

참고로 위의 예제 코드는 Apple에서 편집했습니다. 문서에 '-CGColor'메소드에서 반환 된 CGColorRefs에 대한 캐스트 (ID)가 없기 때문입니다. 이는 알려진 문서 버그 : https://devforums.apple.com/message/550670이며, 현재 문서에서 코드를 사용하는 경우 컴파일러 오류가 발생합니다. –

1

그것은 그대로이 코드가 작동 말한다 대상 빌드 단계 탭에서 그룹을 열어 소스를 표시합니다. 소스 파일 목록을 컴파일합니다. 어떤 파일을 두 번 클릭하십시오. 9 월에 플래그가있는 팝업 패널에서 enter-fno-objc-arc를 입력 한 다음 완료를 클릭하십시오.

이 때문에 ARC 파일을 사용하지 않으면 문제가 발생합니다.