Xcode에서 더 이상 사용되지 않는 경고 억제


133

모든 SDK가 떠 다니기 때문에 여러 SDK 및 플랫폼을 빌드하는 것이 편리합니다. 그러나 3.2에서 3.0으로, 때로는 2.x로 튀어 나오면 변경되거나 대체 된 메소드와 관련하여 더 이상 사용되지 않는 경고가 자주 나타납니다.

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

이전 OS와의 호환성을 유지하고 싶을 때 빌드 할 때 '노이즈'를 제거하려고 노력하고 있기 때문에 이러한 경고를 끄거나 끄는 방법이 있습니까?


4
Paul R의 대답은 효과가 있지만, Manicaesar는 조금 더 외과적인 것으로 생각하면 중요한 다른 추가 경고를 잃지 않고 원하는 경고를 정확하게 억제 할 수 있습니다. 모범 사례와 관련하여 매니 카 시어에는 The Correct Answer ™
Olie

답변:


82

-Wno-deprecated-declarationsXcode의, 또는 해당 설정을 사용해보십시오 GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(프로 팁 :이 경고에 대한 특정 설정을 찾으려면 빌드 설정에 "더 이상 사용되지 않음"만 입력하십시오).

Xcode의 현재 버전 (예 : Xcode 9.2) :

여기에 이미지 설명을 입력하십시오


Xcode의 고대 버전 (예 : Xcode 2.x, 3.x) :

여기에 이미지 설명을 입력하십시오


17
그것보다 훨씬 쉽다는 것이 밝혀졌습니다. Xcode 대상 설정에는 확인란이 있습니다. 당신의 대답은 거기서 검색하도록 촉구했습니다. 감사!
Ben Gottlieb

4
파일 단위로이 작업을 수행 할 수도 있습니다. 파일 별 플래그를 추가하려면이 답변을 참조하십시오. stackoverflow.com/a/6658549/272473
mrwalker

4
이와 같은 답변은 newbs에게 실망 스럽습니다. 어디에서 해봐? 대상 설정은 어떻게 찾습니까? 조금 더 설명하면이 답변의 가치가 높아집니다.
noogrub

8
이 잘못 설명 된 답변이 올바른 것으로 표시되어서는 안됩니다.
Chris Hatton

6
빌드 설정에서 "더 이상 사용되지 않음"을 검색하면 볼 수 있습니다.
quantumpotato

337

@samiq 게시물에 댓글을 아직 추가 할 수 없으므로 확장 할 것이라고 생각합니다. 더 이상 사용되지 않는 기능을 사용하는 함수 / 메소드 앞에 언급 된 지시문을 입력하십시오. 그런 다음 기능 종료 정의 후 이전 설정을 복원 할 수 있습니다.

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop

1
우수한! 이것은 내가 +1을 찾는 것입니다 :)
Zoran Simic

1
멋진 팁! 메서드 안에서 선언 할 수없는 것이 너무 나쁩니다.
더스틴

12
실제로 메소드 내부에서 선언 할 수 있습니다. 방금 docs / sdk의 버그로 인해 오늘해야했습니다
jer

6
+1 #pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop 이 방법 을 사용하면 이전에 설정 한 내용으로 되돌아 갈 수 있으므로 구문을 사용하는 것이 더 나은 방법입니다 . [ gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
Niclas

3
제안에 따라 변경 :)
manicaesar

143

Clang은 @manicaesar 포스트의 "복원"단계를 초기 경고 상태와 무관하게 만드는 멋진 기능을 제공합니다.

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop

Clang 매뉴얼 을 인용하려면 :

GCC의 pragma에서 제공하는 모든 기능 외에도 Clang을 사용하면 현재 경고 상태를 푸시 및 팝할 수 있습니다. 이것은 다른 사람들이 컴파일 할 헤더 파일을 작성할 때 특히 유용합니다. 어떤 경고 플래그를 사용하는지 알 수 없기 때문입니다.


1
최신 버전의 GCC는 동일한 구문을 사용합니다 (GCC를 clang으로 대체).
Niclas

3
나는 항상 LLVM, GCC 및 Clang에 대해 혼란스러워합니다. 그래서 시간을 절약하기 위해 메모를 남기고 싶었습니다. GCC (GNU Complier Collection)는 Xcode 3과 함께 사용되었으며 Apple은 하이브리드 LLVM-GCC와 함께 Xcode 4를 출시했습니다. 그런 다음 LLVM (Low Level Virtual Machine) 컴파일러가 대신했습니다. 자세한 내용은 llvm.org를 참조하십시오 . Xcode 7.2.1부터 기본 컴파일러는 Apple LLVM 7.0입니다. LLVM 컴파일러는 다른 "프로젝트", 디버거 및 Clang 기본 컴파일러를 포함하는 기타 도구의 라이브러리입니다. Clang은 "LLVM 네이티브"C / C ++ / Objective-C 컴파일러입니다.
Serge-K

42

우리는 구형 OS를 지원해야하지만 경고에주의를 기울여야하기 때문에 좀 더 깔끔한 방법을 원했습니다. 나는 이것을 모질라 코드에서 영감을 얻었습니다.

#define SILENCE_DEPRECATION(expr)                                   \
do {                                                                \
_Pragma("clang diagnostic push")                                    \
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")   \
expr;                                                               \
_Pragma("clang diagnostic pop")                                     \
} while(0)

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr)
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr)

이를 통해 다음을 수행 할 수 있습니다.

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]);

또한 코드 블록과 함께 작동합니다.

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self];
    view.lineWidth = self.lineWidth;
    view.strokeColor = self.color;
);

또한 iOS 7 이전 장치에 대한 지원을 중단하면 코드를 쉽게 검색하여 더 이상 사용되지 않는 사용법을 찾을 수 있습니다.


이것은 글로벌 / 프로젝트 수준에서 더 이상 사용되지 않는 (또는 다른) 경고를 억제하는 것보다 대부분의 코드에 대해 훨씬 더 장기적인 솔루션입니다. 훌륭한 답변.
natbro

1
do { ... } while(0);필요한가요?
Ben Leggiero

1
@ BenC.R.Leggiero는 블록을 전달하지 않고 괄호 사이에 여러 문장을 전달하기 때문입니다. 기본적으로 모든 라인에 대한 경고를 표시하지 않습니다.
Alejandro Iván

1
@ AlejandroIván 나는 당신의 설명이 당신에게 의미가 있다는 것을 알고 있습니다 ...하지만 나에게, 그것은 당신이 질문을 다시 쓰는 것처럼 보입니다. do{...}while(0);특히 여기에 필요한 이유를 설명 할 수 있습니까 ? 왜 안돼 {...}? 왜 안돼 if(true){...}? 등
벤 Leggiero

2
@ BenC.R. Leggiero 당신이 맞아요. 어떤 이유로 나는 당신의 질문을 잘못 읽었습니다. 수락 된 답변을 확인하십시오 : stackoverflow.com/questions/154136/…
Alejandro Iván

29

다음을 사용하여 파일 당 경고를 표시하지 않을 수도 있습니다.

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

결과적으로 모든 경고를 한 번에 억제하는 것보다 조금 더 나은 연습을합니다 ... 결국 당신이 무엇을하고 있는지 알고 있어야합니다.


20

더 이상 사용되지 않는 메소드 구현 또는 더 이상 사용되지 않는 클래스 구현을 경고 하려면 다음을 사용하십시오.

    #pragma clang 진단 푸시
    #pragma clang 진단이 "-사용되지 않는 구현"을 무시했습니다.
    // 코드
    #pragma clang 진단 팝


"-Wdeprecated-declarations"를 보았을 때 "-Wdeprecated-implementations"가 있어야한다고 생각합니다. 그리고 실제로 작동합니다. 감사합니다.
DawnSong

8

빌드 설정에서을 찾으십시오 Deprecated Functions.

여기에 이미지 설명을 입력하십시오


"더 이상 사용되지 않는"경고는 모두 닫히지 만 일부 경고 만 억제하면됩니다.
DawnSong

2

담요를 원하면 코드에서 모든 종류의 지원 중단을 확인하십시오. 아래와 같이 -Wdeprecated 플래그를 사용하십시오 :

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop

-3

타사 헤더 파일에서 경고를 비활성화하려면 파일 맨 위에 다음 줄을 추가하십시오.

#pragma clang system_header
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.