구현 된 프로토콜 없이 NSObject 인스턴스에서 선택기를 사용하고 싶습니다 . 예를 들어, 호출 된 NSObject 인스턴스가 지원하는 경우 오류 속성을 설정해야하는 범주 메서드가 있습니다. 이것은 코드이며 코드는 의도 한대로 작동합니다.
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
그러나 컴파일러는 setError : 시그니처와 관련된 메소드를 찾지 못하므로 @selector(setError:)
스 니펫 이 포함 된 각 줄에 대해 경고를 표시합니다 .
Undeclared selector 'setError:'
이 경고를 없애기 위해 프로토콜을 선언하고 싶지는 않습니다. 왜냐하면 이것을 사용하여 특별한 것을 구현하기 위해 모든 클래스를 원하지 않기 때문입니다. 관습에 따라 setError:
메소드 또는 속성 을 갖기를 원합니다 .
이것이 가능합니까? 어떻게?
건배,
EP
답변
다른 옵션은 다음을 사용하여 경고를 비활성화하는 것입니다.
#pragma GCC diagnostic ignored "-Wundeclared-selector"
이 줄은 경고가 발생하는 .m 파일에 배치 할 수 있습니다.
최신 정보:
다음과 같이 LLVM에서도 작동합니다.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
... your code here ...
#pragma clang diagnostic pop
답변
NSSelectorFromString을 살펴 보십시오 .
SEL selector = NSSelectorFromString(@"setError:");
if ([self respondsToSelector:selector])
@selector
키워드를 통해 컴파일 타임 대신 런타임에 선택기를 작성할 수 있으며 컴파일러는 불평 할 기회가 없습니다.
답변
나는 이것이 이상한 이유로 선택기가 런타임에 등록되지 않았기 때문이라고 생각합니다.
다음을 통해 선택기를 등록하십시오 sel_registerName()
.
SEL setErrorSelector = sel_registerName("setError:");
if([self respondsToSelector:setErrorSelector]) {
[self performSelector:setErrorSelector withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
답변
메소드를 사용하여 파일을 #include ‘하여 메시지를 제거했습니다. 그 파일에서 다른 것은 사용되지 않았습니다.
답변
이 스레드에 약간 늦었다는 것을 알고 있지만 완전성을 위해 대상 빌드 설정을 사용 하여이 경고를 전체적으로 끌 수 있습니다.
‘Apple LLVM 경고-Objective-C’섹션에서 다음을 변경하십시오.
Undeclared Selector - NO
답변
클래스가 setError : 메소드를 구현하는 경우 (최종 오류 특성의 setter를 동적으로 선언하여도) 인터페이스 파일 (.h)에 선언하거나이를 표시하지 않으려는 경우 PrivateMethods 까다로운 트릭으로 시도하십시오.
@interface Yourclass (PrivateMethods)
- (void) yourMethod1;
- (void) yourMethod2;
@end
@implementation 직전에 경고가 숨겨져 있어야합니다.;).
답변
당신 .pch
이나 Common.h
당신이 원하는 곳에 넣을 수있는 정말 편안한 매크로 :
#define SUPPRESS_UNDECLARED_SELECTOR_LEAK_WARNING(code) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wundeclared-selector"\"") \
code; \
_Pragma("clang diagnostic pop") \
비슷한 문제에 대한 이 질문 의 편집입니다 …