Wie kennzeichne ich eine Methode in Objective-C 2.0 als veraltet?

141

Ich bin Teil eines Teams, das eine ziemlich große iPad-App entwickelt, und als Ergebnis haben wir viele verschiedene Klassen erstellt. Das Problem ist, dass einige der Methoden mittlerweile ziemlich veraltet sind und ich sie noch nicht einfach entfernen möchte, da ich weiß, dass einige Teile des Gesamtsystems die Methoden verwenden ... aber es gibt bessere (neuere) Varianten, die verwendet werden sollten stattdessen (einige der alten nennen tatsächlich die neuen, aber die gesamte Klassenschnittstelle wird chaotisch).

Gibt es eine Möglichkeit, bestimmte Methoden als veraltet zu markieren (wie @deprecatedin Java und [Obsolete]in .NET)?

Ich sehe, dass Apple Availability.h verwendet und Tags wie hat

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... ist dies der einzige Weg, dies zu tun (+ ist es im App Store sicher, dies zu tun?) oder gibt es Alternativen, die eine Warnung in Xcode markieren?

Jamie Chapman
quelle

Antworten:

163

Abschreibungssyntax

Syntax wird bereitgestellt, um Methoden als veraltet zu markieren:

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

oder:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end
Shay Erlichmen
quelle
7
Dieses Makro macht für mich Sinn, es behält irgendwie das Gefühl der __attribute__Syntax bei. #define __deprecated__ __attribute__((deprecated))
Zekel
Interessanterweise gibt mir Xcode keine Warnungen für die Verwendung einer als abgeschrieben gekennzeichneten Methode. Gibt es ein Compiler-Flag, das gesetzt werden muss?
Memmons
In der Dropdown-Liste zur Code-Vervollständigung von Xcode sehe ich, dass die Methode als veraltet markiert ist, ihre Verwendung jedoch keine Compiler-Warnung ausgibt.
Memmons
1
@Answerbot Build Einstellungen> warnen vor veralteten Funktionen ... setzen Sie dies auf YES
bandejapaisa
Wie füge ich die alternative Methode hinzu, die verwendet werden soll?
OXXY
135

IMHO ist es einfacher, __deprecated zu schreiben:

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

Funktioniert auch im Unterricht

__deprecated
@interface MyDeprecatedClass

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

@end
Víctor B.
quelle
2
Viel besserer Weg, dies zu tun.
SG1
1
Keine Beschreibung angegeben, so dass Sie nicht wissen, ob Sie andere Methode verwenden sollten oder was ...
Raistlin
1
#define __deprecated __attribute __ ((veraltet))
Parag Bafna
Warum ist es besser als DEPRECATED_ATTRIBUTE? Nur weil es kürzer ist oder es einen tatsächlichen Unterschied gibt?
Kelin
88

Wenn Sie eine zusätzliche Nachricht mit dem Verfallsflag senden möchten, können Sie die folgenden Flags verwenden.

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

Anhand der oben genannten Flags können Sie erkennen, warum Sie veraltet sind oder welche Methode der Entwickler in Zukunft verwenden sollte.

Uiroshan
quelle
2
Ich bevorzuge eine Nachricht mit einer Abwertungswarnung. Es ist für neue Benutzer einer API viel hilfreicher. Ich denke, das ist die beste Antwort.
Johnnieb
Diese Antwort gefällt mir am besten, da sie am klarsten und einfachsten mit Copy-Paste von genau dem zu verwenden ist, was ich brauche. Könnten Sie es bitte auch mit einem Beispiel für die Ablehnung einer Methode erweitern? eine ganze Klasse? Wird es genauso gemacht?
Motti Shneor
15

Verwenden Sie __attribute __ ((veraltet ("Ihre Nachricht geht hierher"))), um eine Methode als veraltet zu markieren.

Ein praktisches Beispiel von 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
quelle
14

Verwenden Sie das deprecatedAttribut:

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