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


141

Je fais partie d'une équipe développant une application iPad assez volumineuse et nous avons créé de nombreuses classes différentes. 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 variantes (plus récentes) disponibles qui devraient être utilisées à la place (certains des anciens appellent en fait les nouveaux, mais l'interface de classe globale devient désordonnée).

Existe-t-il un moyen de marquer certaines méthodes comme dépréciées (comme @deprecateden Java et [Obsolete]en .NET).

Je vois qu'Apple utilise Availability.h et a 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-ce que l'App Store est sûr de le faire?) ou existe-t-il des alternatives qui signaleront un avertissement dans Xcode?

Réponses:


163

Syntaxe de dépréciation

La syntaxe est fournie pour marquer les méthodes comme obsolètes:

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

ou:

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

7
Cette macro a un sens pour moi, elle conserve en quelque sorte la sensation de la __attribute__syntaxe. #define __deprecated__ __attribute__((deprecated))
zekel

Fait intéressant, Xcode ne me donne aucun avertissement pour l'utilisation d'une méthode marquée comme dépréciée. Y a-t-il un indicateur de compilateur qui doit être défini?
memmons

Dans la liste déroulante de complétion de code de Xcode, je vois que la méthode est marquée comme dépréciée, mais son utilisation ne donne pas d'avertissement au compilateur.
memmons

1
@Answerbot Build settings> avertir des fonctions obsolètes ... réglez ceci sur YES
bandejapaisa

comment ajouter la méthode alternative à utiliser?
OXXY

135

À mon humble avis, il est plus facile d'écrire __deprecated:

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

Fonctionne aussi sur les classes

__deprecated
@interface MyDeprecatedClass

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

@end

2
Une bien meilleure façon de le faire.
SG1

1
Aucune description fournie, vous ne saurez donc pas si vous devez utiliser une méthode différente ou quoi ...
raistlin

1
#define __deprecated __attribute __ ((deprecated))
Parag Bafna

Pourquoi c'est mieux que DEPRECATED_ATTRIBUTE? Juste parce que c'est plus court ou qu'il y a une différence réelle?
kelin

88

Si vous souhaitez donner un message supplémentaire avec l'indicateur d'obsolescence, 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 vous désapprouvez ou quelle méthode le développeur devrait utiliser à l'avenir.


2
Je préfère avoir un message avec un avertissement d'obsolescence. C'est beaucoup plus utile pour les nouveaux utilisateurs d'une API. Donc, je pense que c'est la meilleure réponse.
johnnieb

J'aime mieux cette réponse, étant la plus claire et la plus simple à utiliser avec un copier-coller de ce dont j'ai besoin. Pourriez-vous également l'améliorer avec un exemple de désapprobation d'une méthode? une classe entière? Est-ce fait exactement de la même manière?
Motti Shneor

15

Pour marquer une méthode comme obsolète, utilisez __attribute __ ((deprecated ("Your message going here")))

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

Utilisez l' deprecatedattribut:

- (int)bar: (int)x __attribute__((deprecated));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.