Objective-C 2.0'da kullanım dışı bırakılmış bir yöntemi nasıl işaretleyebilirim?


141

Oldukça büyük bir iPad uygulaması geliştiren bir ekibin parçasıyım ve sonuç olarak oluşturduğumuz birçok farklı sınıf var. Sorun şu ki, bazı yöntemler artık oldukça eski ve genel sistemin bazı bölümlerinin yöntemleri kullandığını bildiğim için bunları henüz kaldırmak istemiyorum ... ancak kullanılması gereken daha iyi (daha yeni) varyantlar var bunun yerine (eskilerinden bazıları aslında yenilerini çağırır, ancak genel sınıf arayüzü dağınık hale gelir).

( @deprecatedJava ve [Obsolete].NET gibi) belirli yöntemleri amortisman olarak işaretleyebilirsiniz bir yolu var mı .

Apple'ın Availability.h kullandığını ve

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... bunu yapmanın tek yolu bu mu (+ App Store bunu yapmak için güvenli mi?) veya Xcode'da bir uyarı işaretleyecek alternatifler var mı?

Yanıtlar:


163

Kullanımdan Kaldırma Sözdizimi

Sözdizimi, yöntemleri kullanımdan kaldırılmış olarak işaretlemek için sağlanır:

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

veya:

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

7
Bu makro benim için bir anlam ifade ediyor, __attribute__sözdiziminin hissini koruyor . #define __deprecated__ __attribute__((deprecated))
zekel

İlginç bir şekilde Xcode, amortisman olarak işaretlenmiş bir yöntemi kullanmak için bana herhangi bir uyarı vermiyor. Ayarlanması gereken bir derleyici bayrağı var mı?
memmons

Xcode'un kod tamamlama açılır menüsünde, yöntemin amortisman olarak işaretlendiğini görüyorum, ancak bunu kullanarak derleyici uyarısı vermiyor.
18'de memmons

1
@Answerbot Derleme ayarları> kullanımdan kaldırılan işlevler hakkında uyar ... bunu EVET olarak ayarla
bandejapaisa

kullanılması gereken Alternatif yöntem nasıl eklenir?
OXXY

135

IMHO, __deprecated yazmak daha kolay:

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

Sınıflarda da çalışır

__deprecated
@interface MyDeprecatedClass

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

@end

2
Bunu yapmanın çok daha iyi bir yolu.
SG1

1
Açıklama yapılmadı, bu yüzden farklı bir yöntem kullanmanız gerekip gerekmediğini bilmeyeceksiniz ...
raistlin

1
#define __deprecated __attribute __ ((kullanımdan kaldırıldı))
Parag Bafna

Neden daha iyi DEPRECATED_ATTRIBUTE? Daha kısa olması ya da gerçek bir fark olması nedeniyle mi?
kelin

88

Kullanımdan kaldırma bayrağı ile ek mesaj vermek isterseniz, aşağıdaki bayrakları kullanabilirsiniz.

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

Yukarıda belirtilen bayrakları kullanarak neden geliştirmediğinizi veya geliştiricinin gelecekte ne kullanması gerektiğini anlayabilirsiniz.


2
Kullanımdan kaldırma uyarısı içeren bir mesaj almayı tercih ederim. Bir API'nın yeni kullanıcıları için çok daha yararlıdır. Bence bu en iyi cevap.
johnnieb

Bu cevabı en çok sevdim, ihtiyacım olan şeyin kopyala yapıştırması ile kullanımı en açık ve kolay olanı. Lütfen bir yöntemden vazgeçme örneği ile de geliştirebilir misiniz? bütün bir sınıf mı? Aynı şekilde mi yapılıyor?
Motti Shneor

15

Bir yöntemi kullanımdan kaldırılmış olarak işaretlemek için __attribute __ ((kullanımdan kaldırıldı ("Mesajınız buraya gelir")))

Mantle'den pratik bir örnek

@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

14

Şu özelliği kullanın deprecated:

- (int)bar: (int)x __attribute__((deprecated));
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.