2011-01-13 2 views
2

몇 가지 클래스 메서드를 UIColor에 추가하려고합니다. 내가 그들을 구현했습니다 모든 것이 잘 컴파일하지만 런타임에 나는 다음과 같은 오류 얻을 :클래스 메서드를 추가하기 위해 범주를 사용할 수 있습니까?

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIColor colorWithHex:]: unrecognized selector sent to class 0x8d1d68'

여기에 헤더 파일입니다 :

#import "UIColor+Hex.h" 


@implementation UIColor (Hex) 

+ (UIColor*) colorWithHex: (NSUInteger) hex { 
    CGFloat red, green, blue, alpha; 

    red = ((CGFloat)((hex >> 16) & 0xFF))/((CGFloat)0xFF); 
    green = ((CGFloat)((hex >> 8) & 0xFF))/((CGFloat)0xFF); 
    blue = ((CGFloat)((hex >> 0) & 0xFF))/((CGFloat)0xFF); 
    alpha = hex > 0xFFFFFF ? ((CGFloat)((hex >> 24) & 0xFF))/((CGFloat)0xFF) : 1; 

    return [UIColor colorWithRed: red green:green blue:blue alpha:alpha]; 
} 
@end 

I : 여기

@interface UIColor (Hex) 
+ (UIColor*) colorWithHex: (NSUInteger) hex; 
@end 

를 구현이다 '링커 플래그에 -all_load를 추가하는 방법을 찾았지만 그렇게하면 같은 결과가 나타납니다. 그것이 명확하지 않다면 이것은 iPhone에 있습니다.

+0

헤더 파일을 가져 왔습니까? 구현 파일에서 그 내용은 무엇입니까? – BoltClock

+0

구현이 추가되었습니다. – Inferis

답변

0

흠. 디버깅을 위해 빌드 구성을 릴리스 및 다시 변경 한 후에는 매력과 같이 작동했습니다. 이상합니다.

+0

나는 똑같은 문제가 있었다. 모든 것은 정확했지만 작동하지 않았습니다. 타겟에 포함 된 체크 표시를 제거하고 빌드했습니다. 그런 다음 체크 표시를 다시 추가하고 다시 작성하면 효과가있었습니다. 이 버그는 현재 3 살입니다. 감사. – LostInTheTrees

7

예, 가능합니다. 아마도 .m을 프로젝트에 컴파일하지 않을 것입니다.

+0

"내 프로젝트에서 .m을 컴파일하지 못했습니다"? .h 파일 옆에 있습니다. – Inferis

+0

@Inferis - 확실하지만, 오류가 발생한다는 것은 코드가 실행될 때 .m 파일에 정의 된 코드가 없거나로드되지 않았거나 철자가 틀린 것을 의미합니다. 그렇지 않은 경우 처음부터 컴파일. –

+0

좋습니다. 어떻게 강제로 컴파일 할 수 있습니까? – Inferis

0

확실히 할 수 있습니다. 내에서 뭔가 잘못되었다고 생각하고 있습니다 @implementation UIColor(Hex)

1

하지만 프레임 워크 클래스에 메서드 (인스턴스 또는 클래스)를 추가 할 때는 매우주의해야합니다. 동일한 이름이지만 다른 의미가있는 메소드가 어느 곳에 나 존재하면 그 효과는 정의되지 않습니다. 특히, 같은 이름을 가진 사설 시스템 프레임 워크 메소드가있을 수도 있고, 미래의 OS 릴리스에 의해 추가 될 수도 있습니다 (또는 최악의 경우), 입력 관리자, 색상 선택기 및 기타를 포함하여 다른 번들에 의해 추가 될 수 있습니다 코드 주입 메커니즘. 이것은 실제 생활에서 발생하는 실제 문제입니다.

기본적으로 1) Do not Do (예 : 표준 C 함수 사용) 또는 2) 접두어를 사용하여 이름 충돌의 가능성을 줄이기위한 조치를 취하십시오. 클래스 이름에 - 예 : inferis_colorWithHex:

+0

봐, 나는 위험을 안다. 나는 그것이 왜 효과가 없는지 알고 싶다. ;) – Inferis

+0

@Joe : 멋지다. 그 기술을 몰랐다. – Inferis

+0

"it 's cowboy yet cool"덧글, heh – donkim

0

이 메서드를 호출하는 클래스에서 .h 파일을 가져 왔습니까? 또한 모든 .m 파일이 대상에 있는지 확인하십시오.

2

"기타 링커 플래그"설정에서 -ObjC-all_load 링커 플래그를 추가해야합니다.

0

늦은 시간이지만 JiC는 작업 공간에서 CocoaPods를 사용하고 use_frameworks 지시문을 지정한 경우 다른 프레임 워크의 범주 소스 코드가 도착하는지 여부에 영향을주는 것으로 보이는 경우 다른 사람들이 몇 시간 동안 머리를 찢어내는 데 도움이됩니다. 짐을 실은.

관련 문제