web-dev-qa-db-fra.com

Comment déprécier une méthode dans Xcode

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?

75
Julien

__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() {
    ...
}
148
kennytm

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
69
skywinder

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

1
Ant6n

Swift 5.0

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:

  • introduit
  • obsolète
  • obsolète
  • message
  • renommé

Pour plus d'informations, voir Apple doc: Attributs

0
Lal Krishna

- POUR Swift CODE:

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 {
    ...
}
0
Mojtaba Hosseini