การระงับคำเตือนที่เลิกใช้แล้วใน Xcode


134

ด้วย SDK ทั้งหมดที่ลอยอยู่รอบ ๆ ทำให้สะดวกในการสร้างสำหรับ SDK และแพลตฟอร์มต่างๆ อย่างไรก็ตามการตีกลับจาก 3.2 เป็น 3.0 และแม้กระทั่ง 2.x ในบางครั้งฉันมักจะได้รับคำเตือนที่เลิกใช้งานซึ่งเกี่ยวข้องกับวิธีการที่เปลี่ยนแปลงหรือถูกแทนที่:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

เนื่องจากฉันยังคงต้องการรักษาความเข้ากันได้กับ OS รุ่นเก่าและฉันก็พยายามที่จะลบ 'สัญญาณรบกวน' เมื่อสร้างมีวิธีปิดหรือปิดคำเตือนเหล่านี้หรือไม่?


4
ในขณะที่คำตอบของ Paul R ใช้ได้ผลให้พิจารณาว่า manicaesar นั้นเป็นการผ่าตัดมากกว่าเล็กน้อยซึ่งจะช่วยให้คุณสามารถระงับคำเตือนที่คุณต้องการได้โดยไม่สูญเสียคำเตือนเพิ่มเติมอื่น ๆ ซึ่งอาจมีความสำคัญ สำหรับฉันแล้วสำหรับแนวทางปฏิบัติที่ดีที่สุด manicaesar มี The Correct Answer ™
Olie

คำตอบ:


83

ลอง-Wno-deprecated-declarationsหรือการตั้งค่าที่เกี่ยวข้องใน Xcode 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
คำตอบเช่นนี้น่าหงุดหงิดสำหรับมือใหม่ ลองดูที่ไหน ฉันจะค้นหาการตั้งค่าเป้าหมายได้อย่างไร คำอธิบายเพิ่มเติมเล็กน้อยจะเพิ่มมูลค่าของคำตอบนี้
noogrub

8
คำตอบที่อธิบายไม่ดีนี้ไม่ควรถูกทำเครื่องหมายว่าถูกต้อง
Chris Hatton

6
ค้นหา "เลิกใช้งาน" ในการตั้งค่าบิวด์แล้วคุณจะเห็น
quantumpotato

338

เนื่องจากฉันยังไม่สามารถเพิ่มความคิดเห็นในโพสต์ @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
เคล็ดลับสุดเจ๋ง! น่าเสียดายที่ไม่สามารถประกาศภายในเมธอดได้
Dustin

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

144

เสียงดังเป็นคุณสมบัติที่ดีที่ทำให้ขั้นตอน "คืนค่า" ในโพสต์ @manicaesar เป็นอิสระจากสถานะการเตือนเริ่มต้น

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

หากต้องการอ้างอิงคู่มือ Clang :

นอกเหนือจากฟังก์ชั่นทั้งหมดที่มีให้โดย pragma ของ GCC แล้ว Clang ยังช่วยให้คุณสามารถผลักดันและเปิดสถานะคำเตือนปัจจุบัน สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อเขียนไฟล์ส่วนหัวที่คนอื่นจะคอมไพล์เพราะคุณไม่รู้ว่าพวกเขาสร้างแฟล็กคำเตือนอะไร


1
GCC เวอร์ชันล่าสุดใช้ไวยากรณ์เดียวกัน (แทนเสียงดังสำหรับ GCC)
Niclas

3
ฉันมักจะสับสนอยู่เสมอว่า LLVM, GCC และ Clang คืออะไร ดังนั้นฉันจึงต้องการวางโน้ตเพื่อประหยัดเวลา GNU Complier Collection (GCC) ถูกใช้กับ Xcode 3 จากนั้น Apple เปิดตัว Xcode 4 พร้อม LLVM-GCC แบบไฮบริด จากนั้นระดับต่ำเครื่องเสมือน (LLVM) คอมไพเลอร์เข้ามาดูข้อมูลเพิ่มเติมได้ที่llvm.org ใน Xcode 7.2.1 คอมไพเลอร์เริ่มต้นคือ Apple LLVM 7.0 คอมไพเลอร์ LLVM เป็นไลบรารีของ "โปรเจ็กต์" ตัวดีบั๊กและเครื่องมืออื่น ๆ ซึ่งรวมถึงคอมไพเลอร์เนทีฟของ Clang เสียงดังเป็นคอมไพเลอร์ C / C ++ / Objective-C "LLVM native"
serge-k

43

เนื่องจากเรามักจะต้องรองรับ OS รุ่นเก่า แต่ให้ความสำคัญกับคำเตือนของเราฉันจึงต้องการวิธีที่เป็นระเบียบมากขึ้นในการดำเนินการนี้ ฉันรวบรวมสิ่งนี้เข้าด้วยกันโดยได้รับแรงบันดาลใจจากรหัส Mozilla:

#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){...}? ฯลฯ
Ben Leggiero

2
@ BenC.R.Leggiero คุณพูดถูก ด้วยเหตุผลบางประการฉันอ่านคำถามของคุณผิด ตรวจสอบคำตอบที่ยอมรับได้ที่นี่: stackoverflow.com/questions/154136/…
Alejandro Iván

29

คุณยังสามารถระงับคำเตือนต่อไฟล์ได้โดยใช้

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

ซึ่งจะทำให้การปฏิบัติดีขึ้นกว่าการระงับคำเตือนทั้งหมดเพียงครั้งเดียวและร่วมกัน ... หลังจากทั้งหมดคุณต้องรู้ว่าคุณทำเพื่ออะไร


22

หากคุณต้องการปิดเสียงคำเตือนการนำเมธอดที่เลิกใช้ไปใช้งานหรือการใช้คลาสที่เลิกใช้แล้วให้ใช้:

    #pragma clang push การวินิจฉัย
    #pragma clang ไม่สนใจการวินิจฉัย "-Wdeprecated -plementations"
    // รหัส
    #pragma clang ป๊อปวินิจฉัย


เมื่อฉันเห็น "-Wdeprecated-declarations" ฉันเดาว่าต้องมี "-Wdeprecated -plementations" และได้ผลจริง ขอบคุณ.
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.