Nous livrons notre bibliothèque à nos clients et j'aimerais marquer certaines méthodes comme "obsolètes" parce que nous les avons modifiées (comme Apple le fait dans le kit de développement logiciel iPhone).
J'ai vu la macro de préprocesseur __OSX_AVAILABLE_BUT_DEPRECATED
, mappée sur __AVAILABILITY_INTERNAL
, mappée sur __attribute__((deprecated))
...
Eh bien, je suis un peu confus avec ce genre de choses!
Quelqu'un sait quelque chose à ce sujet?
__attribute__((deprecated))
est le moyen gcc (également pris en charge dans clang ) pour marquer une fonction/méthode comme obsolète. Quand l'un d'entre eux est marqué comme "obsolète", un avertissement sera émis à chaque appel.
La syntaxe pour les fonctions normales serait
__attribute__((deprecated))
void f(...) {
...
}
// gcc 4.5+ / clang
__attribute__((deprecated("g has been deprecated please use g2 instead")))
void g(...) {
...
}
et celui des méthodes Objective-C serait
@interface MyClass : NSObject { ... }
-(void)f:(id)x __attribute__((deprecated));
...
@end
Vous pouvez également marquer la classe entière comme obsolète avec
__attribute__((deprecated))
@interface DeprecatedClass : NSObject { ... }
...
@end
Apple fournit également l'en-tête <AvailabilityMacros.h>
qui fournit les macros DEPRECATED_ATTRIBUTE et DEPRECATED_MSG_ATTRIBUTE (msg) qui développent les attributs ci-dessus, ou rien si le compilateur ne prend pas en charge les attributs. Notez que cet en-tête n'existe pas en dehors de OS X/iOS.
Remarque secondaire, si vous utilisez Swift, vous utilisez l’attribut @available
pour déconseiller un élément, par exemple.
@available(*, deprecated=2.0, message="no longer needed")
func f() {
...
}
Vous pouvez également utiliser plus lisible define DEPRECATED_ATTRIBUTE
Il a défini dans usr/include/AvailabilityMacros.h
:
#define DEPRECATED_ATTRIBUTE __attribute__((deprecated))
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))
Objective-C exemple de méthode:
@interface MyClass : NSObject { ... }
-(void)foo:(id)x DEPRECATED_ATTRIBUTE;
// If you want to specify deprecated message:
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");
...
@end
Vous pouvez également marquer la classe entière comme obsolète:
DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end
Si vous utilisez C++ 14 dans votre projet xcode, vous pouvez également utiliser l'attribut [[deprecated]]
ou [[deprecated("reason")]]
qui fait maintenant partie du langage.
voir la documentation: http://fr.cppreference.com/w/cpp/language/attributes
Obsolète toute méthode/classe/struct/protocoles en utilisant @available
@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }
@available(*, deprecated, renamed: "loadData")
func fetchData() { }
@available(Swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }
@available(Swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")
Params possibles:
Pour plus d'informations, voir Apple doc: Attributs
Mettez ceci juste au dessus de la méthode: @available(*, deprecated: <#Version#>, message: <#Message#>)
exemple:
@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
...
}