web-dev-qa-db-fra.com

Comment signaler une méthode comme obsolète dans Objective-C 2.0?

Je fais partie d'une équipe qui développe une application iPad assez volumineuse et nous avons créé de nombreuses classes différentes à la suite. Le problème est que certaines des méthodes sont maintenant à peu près obsolètes et je ne veux pas simplement les supprimer car je sais que certaines parties du système global utilisent les méthodes ... mais il existe de meilleures (plus récentes) variantes qui devraient être utilisées au lieu de cela (certains des anciens appellent en réalité les nouveaux, mais l’interface globale de la classe est en désordre).

Existe-t-il un moyen de marquer certaines méthodes comme amorties (comme @deprecated in Java et [Obsolete] en .NET).

Je vois que Apple utilise Availability.h et que des balises telles que

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... est-ce la seule façon de le faire (+ est-il sécuritaire de le faire sur l'App Store?) ou existe-t-il des alternatives qui signaleraient un avertissement dans Xcode?

136
Jamie Chapman

Deprecation Syntax

La syntaxe est fournie pour marquer les méthodes comme étant déconseillées:

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

ou:

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

IMHO, il est plus facile d'écrire __deprecated:

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

Fonctionne aussi sur les cours

__deprecated
@interface MyDeprecatedClass

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

@end
132
Víctor B.

Si vous souhaitez attribuer un message supplémentaire avec l'indicateur de désapprobation, vous pouvez utiliser les indicateurs suivants.

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

En utilisant les indicateurs mentionnés ci-dessus, vous pouvez dire pourquoi vous déconseillez ou ce que la méthode devrait utiliser à l’avenir.

81
uiroshan

Pour marquer une méthode comme obsolète, utilisez __ attribut __ ((obsolète ("Votre message va ici")))))

Un exemple pratique, de 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
14
onmyway133

Utilisez l'attribut deprecated:

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