Bagaimana cara menandai metode yang sudah usang di Objective-C 2.0?

141

Saya bagian dari tim yang mengembangkan aplikasi iPad yang cukup besar dan ada banyak kelas berbeda yang telah kami buat sebagai hasilnya. Masalahnya adalah beberapa metode sekarang cukup usang dan saya tidak ingin menghapusnya karena saya tahu beberapa bagian dari keseluruhan sistem menggunakan metode ... tetapi ada varian yang lebih baik (baru) tersedia yang harus digunakan sebagai gantinya (beberapa yang lama benar-benar memanggil yang baru, tetapi keseluruhan antarmuka kelas menjadi berantakan).

Apakah ada cara di mana saya dapat menandai metode tertentu sebagai disusutkan (seperti @deprecateddi Jawa dan [Obsolete].NET).

Saya melihat bahwa Apple menggunakan Availability.h dan memiliki tag seperti

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... apakah ini satu-satunya cara untuk melakukannya (+ apakah App Store aman untuk melakukan ini?) atau adakah alternatif yang akan menandai peringatan di Xcode?

Jamie Chapman
sumber

Jawaban:

163

Sintaksis Pengunduran Diri

Sintaks diberikan untuk menandai metode yang sudah usang:

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

atau:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end
Shay Erlichmen
sumber
7
Makro ini masuk akal bagi saya, itu semacam mempertahankan nuansa __attribute__sintaksis. #define __deprecated__ __attribute__((deprecated))
zekel
Menariknya Xcode tidak memberi saya peringatan untuk menggunakan metode yang ditandai sebagai disusutkan. Apakah ada flag compiler yang perlu diatur?
memo
Dalam dropdown penyelesaian kode Xcode, saya melihat bahwa metode ini ditandai sebagai disusutkan, tetapi menggunakannya tidak memberikan peringatan kompiler.
memmons
1
@Answerbot Build settings> beri peringatan tentang fungsi yang tidak digunakan lagi ... setel ini menjadi YA
bandejapaisa
bagaimana cara menambahkan metode Alternatif yang harus digunakan?
OXXY
135

IMHO, lebih mudah untuk menulis __deprecated:

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

Bekerja juga di kelas

__deprecated
@interface MyDeprecatedClass

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

@end
Víctor B.
sumber
2
Cara yang jauh lebih baik untuk melakukan ini.
SG1
1
Tidak ada deskripsi yang disediakan, jadi Anda tidak akan tahu apakah Anda harus menggunakan metode yang berbeda atau apa ...
raistlin
1
#define __deprecated __attribute __ ((deprecated))
Parag Bafna
Kenapa lebih baik dari itu DEPRECATED_ATTRIBUTE? Hanya karena lebih pendek atau ada perbedaan sebenarnya?
kelin
88

Jika Anda ingin memberikan pesan tambahan dengan flag penghentian, Anda dapat menggunakan flag berikut.

@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.")));

Dengan menggunakan flag-flag yang disebutkan di atas, Anda dapat mengetahui mengapa Anda sudah ketinggalan zaman atau apa yang harus digunakan oleh pengembang metode di masa depan.

uiroshan
sumber
2
Saya lebih suka memiliki pesan dengan peringatan penghentian. Ini jauh lebih bermanfaat bagi pengguna baru API. Jadi, saya pikir ini adalah jawaban terbaik.
johnnieb
Saya paling suka jawaban ini, menjadi yang paling jelas dan termudah untuk digunakan dengan copy-paste dari apa yang saya butuhkan. Bisakah Anda juga meningkatkannya dengan sampel metode yang sudah ketinggalan zaman? seluruh kelas? Apakah ini dilakukan dengan cara yang persis sama?
Motti Shneor
15

Untuk menandai metode yang sudah usang, gunakan __attribut __ ((usang ("Pesan Anda ada di sini")))

Contoh praktis, dari 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
onmyway133
sumber
14

Gunakan deprecatedatribut:

- (int)bar: (int)x __attribute__((deprecated));
Stephen Canon
sumber