ฉันจะตั้งค่าสถานะวิธีที่เลิกใช้ใน Objective-C 2.0 ได้อย่างไร


141

ฉันเป็นส่วนหนึ่งของทีมพัฒนาแอพ iPad ที่ค่อนข้างใหญ่และมีคลาสที่แตกต่างกันมากมายที่เราสร้างขึ้นมา ปัญหาคือวิธีการบางอย่างตอนนี้ล้าสมัยไปแล้วและฉันไม่ต้องการเพียงแค่เอาออกเพราะฉันรู้ว่าบางส่วนของระบบโดยรวมใช้วิธีการ ... แต่มีตัวแปรที่ดีกว่า (ใหม่กว่า) ซึ่งควรใช้ แทน (เก่าบางคนเรียกจริง ๆ ใหม่ แต่อินเทอร์เฟซสำหรับคลาสโดยรวมจะเริ่มยุ่ง)

มีวิธีที่ฉันสามารถทำเครื่องหมายวิธีการบางอย่างเป็นค่าเสื่อมราคา (เช่น@deprecatedใน Java และ[Obsolete]ใน. NET)

ฉันเห็นว่า Apple ใช้ Availability.h และมีแท็กเช่น

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... นี่เป็นวิธีเดียวที่จะทำได้ (+ เป็นที่ App Store ปลอดภัยหรือไม่) หรือมีทางเลือกอื่นที่จะตั้งค่าสถานะการเตือนใน Xcode หรือไม่

คำตอบ:


163

ไวยากรณ์การคัดค้าน

ไวยากรณ์ถูกจัดเตรียมเพื่อทำเครื่องหมายเมธอดว่าเลิกใช้แล้ว:

@interface SomeClass
-method __attribute__((deprecated));
@end

หรือ:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end

7
มาโครนี้มีเหตุผลสำหรับฉันมันเก็บความรู้สึกของ__attribute__ไวยากรณ์ไว้ #define __deprecated__ __attribute__((deprecated))
zekel

Xcode ที่น่าสนใจไม่ได้ให้คำเตือนใด ๆ แก่ฉันสำหรับการใช้วิธีการที่ระบุว่าเป็นค่าเสื่อมราคา มีการตั้งค่าสถานะคอมไพเลอร์ที่จะต้องตั้งค่า?
memmons

ในการดร็อปดาวน์โค้ดที่สมบูรณ์ของ Xcode ฉันเห็นว่าวิธีการนั้นถูกทำเครื่องหมายว่าเป็นค่าเสื่อมราคา แต่การใช้มันไม่ได้ให้คำเตือนของคอมไพเลอร์
memmons

1
@Answerbot Build settings> เตือนเกี่ยวกับฟังก์ชั่นที่เลิกใช้แล้ว ... ตั้งค่านี้เป็น YES
bandejapaisa

วิธีเพิ่มเมธอด Alternative ที่ควรใช้?
OXXY

135

IMHO ง่ายต่อการเขียน __ เลิก:

- (void)myDeprecatedMethod __deprecated;
- (int)methodNameDeprecated:(int)param __deprecated;

ทำงานเกินไปในชั้นเรียน

__deprecated
@interface MyDeprecatedClass

  // ... some properties and methods ...

@end

2
วิธีที่ดีกว่ามากในการทำเช่นนี้
SG1

1
ไม่มีคำอธิบายให้ดังนั้นคุณจะไม่ทราบว่าคุณควรใช้วิธีการที่แตกต่างกันหรืออะไร ...
raistlin

1
#define __deprecated __attribute __ ((คัดค้าน))
Parag Bafna

ทำไมมันจึงดีกว่าDEPRECATED_ATTRIBUTE? เพียงเพราะมันสั้นลงหรือมีความแตกต่างที่แท้จริง?
kelin

88

หากคุณต้องการให้ข้อความเพิ่มเติมด้วยการตั้งค่าสถานะการคัดค้านคุณสามารถใช้การตั้งค่าสถานะต่อไปนี้

@property (strong, nonatomic) NSString *catName
                    __deprecated_msg("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    DEPRECATED_MSG_ATTRIBUTE("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    __attribute__((deprecated("use name instead.")));

เมื่อใช้การตั้งค่าสถานะที่กล่าวถึงข้างต้นคุณสามารถบอกได้ว่าทำไมคุณถึงเลิกใช้งานหรือผู้พัฒนาวิธีการใช้ในอนาคต


2
ฉันชอบที่จะมีข้อความพร้อมคำเตือนการเลิกใช้ มันมีประโยชน์มากสำหรับผู้ใช้ใหม่ของ API ดังนั้นฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด
johnnieb

ฉันชอบคำตอบนี้ดีที่สุดการใช้งานที่ชัดเจนและง่ายที่สุดกับการคัดลอกวางของสิ่งที่ฉันต้องการ คุณช่วยเพิ่มประสิทธิภาพด้วยตัวอย่างวิธีการที่เลิกใช้แล้วได้ไหม ทั้งคลาส? มันทำแบบเดียวกันหรือเปล่า?
Motti Shneor

15

ในการทำเครื่องหมายวิธีที่เลิกใช้ให้ใช้__attribute __ ((เลิกใช้แล้ว ("ข้อความของคุณอยู่ที่นี่")))

ตัวอย่างการปฏิบัติจาก Mantle

@interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions)

+ (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:")));
+ (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:")));

@end

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.