Xcode'da kullanımdan kaldırılmış uyarıları bastırma


133

Etrafta dolaşan tüm SDK'larla, birden çok SDK ve platform için derleme yapabilmek kullanışlıdır. Bununla birlikte, 3.2'den 3.0'a ve hatta bazen 2.x'e sıçrayan, sık sık değiştirilen veya yerini alan yöntemleri içeren kullanımdan kaldırılmış uyarılar alıyorum:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

Hala eski işletim sistemleriyle uyumluluğu sürdürmek istediğimden ve ayrıca oluştururken 'gürültüyü' ortadan kaldırmaya çalıştığım için, bu uyarıları kapatmanın veya devre dışı bırakmanın bir yolu var mı?


4
Paul R'nin cevabı işe yarasa da, manikesarın biraz daha cerrahi olduğunu düşünün, çünkü önemli olabilecek diğer ek uyarıları kaybetmeden tam olarak istediğiniz uyarıyı bastırmanıza izin verir. Bana öyle geliyor ki, en iyi uygulamalar açısından manicaesar'da The Correct Answer ™ var
Olie

Yanıtlar:


82

Deneyin -Wno-deprecated-declarationsveya Xcode'daki karşılık gelen ayarı GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(profesyonel ipucu: bu uyarı için belirli ayarı bulmak için yapı ayarlarına "kullanımdan kaldırıldı" yazın).

Xcode'un güncel sürümleri (örn. Xcode 9.2):

görüntü açıklamasını buraya girin


Xcode'un eski sürümleri (ör. Xcode 2.x, 3.x):

görüntü açıklamasını buraya girin


17
Bundan daha kolay olduğu ortaya çıktı; Xcode hedef ayarlarında bir onay kutusu vardır; Cevabınız benden orada arama yapmamı istedi. Teşekkürler!
Ben Gottlieb

4
Bunu dosya başına da yapabilirsiniz. Dosya başına işaretler eklemek için bu yanıta bakın: stackoverflow.com/a/6658549/272473
mrwalker

4
bunun gibi cevaplar yeniler için sinir bozucu. Nerede dene? Hedef ayarları nasıl bulurum? Biraz daha açıklama bu cevabın değerini artıracaktır.
noogrub

8
Bu kadar az açıklanan bir cevap doğru olarak işaretlenmemelidir.
Chris Hatton

6
Derleme ayarlarında "Kullanımdan Kaldırıldı" ifadesini aradığınızda göreceksiniz.
quantumpotato

337

@Samiq gönderisine henüz yorum ekleyemediğim için onu genişleteceğimi düşünüyorum. Kullanımdan kaldırılmış şeyler kullandığınız bir işlev / yöntemden önce belirtilen yönergeyi girin. Ardından, işlevin tanımlanması bittikten sonra önceki ayarı geri yükleyebilirsiniz:

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

1
Mükemmel! Bu benim :) +1 aradığı şeyi olduğu
Zoran Simic

1
Harika bir ipucu! Ne yazık ki bir yöntem içinde beyan edilemiyor.
Dustin

12
Aslında bir yöntem içinde beyan edilebilir. Docs / sdk'daki bir hata nedeniyle bugün yapmak zorunda kaldım
jer

6
+1 Biraz daha iyi bir yol, sözdizimini kullanmaktır, #pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop çünkü bu yöntem sizi daha önce ayarlanmış olan ayara geri götürür .. [ gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
Niclas

3
Önerilere göre değiştirildi :)
manicaesar

143

Clang, @manicaesar gönderisindeki "geri yükleme" adımını ilk uyarı durumundan bağımsız hale getiren güzel bir özellik sağlar:

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

Clang kılavuzundan alıntı yapmak için :

GCC'nin pragma tarafından sağlanan tüm işlevlere ek olarak, Clang ayrıca mevcut uyarı durumunu zorlamanıza ve açmanıza izin verir. Bu, özellikle başkaları tarafından derlenecek bir başlık dosyası yazarken yararlıdır, çünkü hangi uyarı bayraklarını oluşturduklarını bilmiyorsunuz.


1
GCC'nin daha yeni sürümleri aynı sözdizimini kullanır (GCC yerine clang).
Niclas

3
LLVM, GCC ve Clang'ın ne olduğu konusunda kafam hep karışıyor. Bu yüzden zamandan tasarruf etmek için bir not bırakmak istedim. GNU Complier Collection (GCC), Xcode 3 ile kullanıldı, ardından Apple Xcode 4'ü hibrit bir LLVM-GCC ile piyasaya sürdü. Daha sonra Low Level Virtual Machine (LLVM) derleyicisi devraldı, daha fazla bilgi için llvm.org'a bakın . Xcode 7.2.1'den itibaren varsayılan derleyici Apple LLVM 7.0'dır. LLVM derleyicisi, Clang yerel derleyicisini içeren diğer "projeler", hata ayıklayıcılar ve diğer araçlardan oluşan bir kitaplıktır. Clang bir "LLVM yerel" C / C ++ / Objective-C derleyicisidir.
serge-k

42

Daha eski işletim sistemlerini desteklemeye ihtiyaç duyduğumuzdan, ancak uyarılarımıza dikkat ettiğimizden, bunu yapmanın daha düzenli bir yolunu istedim. Bunu bazı Mozilla kodlarından esinlenerek bir araya getirdim:

#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)

Bu, aşağıdakileri yapmanızı sağlar:

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

Ayrıca kod bloklarıyla da çalışır:

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

Ayrıca, iOS 7 öncesi cihazlar için desteği bıraktığınızda, düzeltilecek kullanımdan kaldırılmış kullanımları bulmak için kodda kolayca arama yapabilirsiniz.


Bu, çoğu kod için genel / proje düzeyinde kullanımdan kaldırma (veya başka herhangi bir) uyarıları kısıtlamaktan çok daha iyi bir uzun vadeli çözümdür. müthiş cevap.
natbro

1
Neden do { ... } while(0);gerekli?
Ben Leggiero

1
@ BenC.R.Leggiero, çünkü bir bloğu değil, bu parantezler arasında birkaç ifade geçiriyorsunuz. Temelde her satır için uyarıları bastırıyorsunuz.
Alejandro Iván

1
@ AlejandroIván Açıklamanızın size mantıklı geldiğini biliyorum ... ama bana göre, soruyu yeniden ifade ediyorsunuz gibi görünüyor. do{...}while(0);Burada özellikle neden gerekli olduğunu açıklayabilir misiniz ? Neden sadece değil {...}? Neden olmasın if(true){...}? vb.
Ben Leggiero

2
@ BenC.R.Leggiero haklısın. Nedense sorunuzu yanlış anladım. Kabul edilen yanıtı buradan kontrol edin: stackoverflow.com/questions/154136/…
Alejandro Iván

29

Ayrıca şunu kullanarak dosya başına uyarıları bastırabilirsiniz:

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

Bu da, tüm uyarıları bir defada ve birlikte bastırmaktan biraz daha iyi bir pratik yapar ... sonuçta bunu ne için yaptığınızı bilmeniz gerekir.


20

Uyarıyı susturmak istiyorsanız Kullanımdan kaldırılmış yöntemi uygulama veya Kullanımdan kaldırılmış sınıfı uygulama , şunu kullanın:

    #pragma clang tanı push
    #pragma clang diagnostiği yok sayıldı "-Wdeprecated-uygulamalar"
    // kod
    #pragma clang tanı pop


"-Wdeprecated-declarations" gördüğümde, "-Wdeprecated-implementations" olması gerektiğini düşünüyorum. Ve gerçekten işe yarıyor. Teşekkür ederim.
DawnSong

8

Derleme ayarlarınızda bulun Deprecated Functions.

görüntü açıklamasını buraya girin


Tüm "kullanımdan kaldırılmış" uyarıları kapatır, ancak yalnızca bazı uyarıların bastırılması gerekir.
DawnSong

2

Bir kod parçasındaki her türlü kullanımdan kaldırmayı kapsamlı bir şekilde kontrol etmek isterseniz. Lütfen aşağıdaki gibi -Wdeprecated bayrağını kullanın :

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

-3

Üçüncü taraf başlık dosyasından uyarıları devre dışı bırakmak için, dosyanın üstüne aşağıdaki satırı ekleyin

#pragma clang system_header
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.