programing

'언클리어드 셀렉터' 경고를 제거하는 방법

muds 2023. 4. 11. 22:42
반응형

'언클리어드 셀렉터' 경고를 제거하는 방법

구현된 프로토콜 없이 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:메서드 또는 속성.

이게 가능해? 어떻게?

다른 옵션은 다음과 같은 방법으로 경고를 비활성화하는 것입니다.

#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

NSSelector From String을 확인합니다.

 SEL selector = NSSelectorFromString(@"setError:");
 if ([self respondsToSelector:selector])

이를 통해 컴파일 시 대신 런타임에 셀렉터를 생성할 수 있습니다.@selector그러면 컴파일러는 불평할 기회가 없어집니다.

어떤 이상한 이유로 실렉터가 런타임에 등록되지 않았기 때문인 것 같습니다.

다음을 통해 실렉터를 등록해 보십시오.

SEL setErrorSelector = sel_registerName("setError:");

if([self respondsToSelector:setErrorSelector]) {
   [self performSelector:setErrorSelector withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}

이 스레드에 조금 늦은 것은 알고 있습니다만, 완전하게 하기 위해서, 타겟 빌드 설정을 사용해 이 경고를 글로벌하게 무효로 할 수 있습니다.

'Apple LLVM 경고 - 목표-C' 섹션에서 다음을 변경합니다.

Undeclared Selector - NO

클래스에 setError: 메서드가 실장되어 있는 경우(종국적인 에러 속성의 setter를 dynamic으로 선언하는 경우라도), 인터페이스 파일(.h)에 선언하고 싶지 않은 경우 PrivateMethods의 까다로운 트릭을 사용해 보겠습니다.

@interface Yourclass (PrivateMethods)

- (void) yourMethod1;
- (void) yourMethod2;

@end

경고는 표시되지 않습니다.

#method에 파일을 포함시켜 없애라는 메시지를 받았습니다.그 파일에서는 다른 것은 사용되지 않았습니다.

이 경고를 회피하는 또 다른 방법은 셀렉터 방식을 다음과 같이 하는 것입니다.

-(void) myMethod :(id) sender{
}

원하는 발신인을 수락하거나 발신인 오브젝트의 유형을 지정하려면 "(id) 발신인"을 잊지 마십시오.

입니다..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")                                         \

비슷한 문제에 대한 이 질문의 편집본입니다.

스크린샷처럼 X코드로 끌 수 있습니다.

여기에 이미지 설명 입력

또한 문제의 개체를 먼저 ID로 캐스팅하여 경고를 피할 수도 있습니다.

if ([object respondsToSelector:@selector(myMethod)]) {
    [(id)object myMethod];
}

정답은 Import를 통해 Xcode에 알리거나 셀렉터를 등록하는 것이지만, 제 경우 세미콜론이 없었습니다.오류를 "수정"하기 전에 오류가 올바르고 코드가 올바르지 않은지 확인하십시오.예를 들어 애플의 MVNetworking 샘플에서 오류를 발견했습니다.

Thenothing 방법을 추가함으로써 경고가 사라지도록 할 수 있었습니다(공개:생각지도 못했는데 time interval로 time timer를 검색해서 찾았어요)

    [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow]
                                     target:self
                                   selector:@selector(donothingatall:)
                                   userInfo:nil
                                    repeats:YES];


    [[NSRunLoop currentRunLoop] run];

    HTTPLogVerbose(@"%@: BonjourThread: Aborted", THIS_FILE);

    }
}

+ (void) donothingatall:(NSTimer *)timer
{

}

경고를 숨기는 방법을 아는 것은 감사하지만, 고치는 것이 더 낫고, 알 수 없는 이유로 세르지오와 릴킨의 기술 중 어느 것도 제게는 효과가 없었습니다.

언급URL : https://stackoverflow.com/questions/6224976/how-to-get-rid-of-the-undeclared-selector-warning

반응형