50 votes

Utilisation de extern en Objective C

Quelle est l'efficacité de l'utilisation du mot-clé extern en Objective C ? Cela rend certaines parties du codage faciles à réaliser.. mais est-ce que cela ne gâche pas l'orientation objet ?

60voto

Quinn Taylor Points 29688

Vous constaterez que extern est largement utilisé dans les frameworks Cocoa, et il serait difficile de trouver un argument convaincant selon lequel leur POO est "gâtée". Au contraire, Cocoa est bien encapsulé et expose seulement ce qu'il doit, souvent via extern. Les constantes définies globalement sont certainement l'utilisation la plus courante, mais pas nécessairement la seule.

À mon avis, utiliser extern ne "gâte" pas nécessairement l'orientation objet. Même en POO, il est fréquent d'utiliser des variables accessibles de n'importe où. Utiliser extern est le contournement le plus fréquent pour pallier au manque de "variables de classe" (comme celles déclarées avec static en Java) en Objective-C. Cela vous permet d'élargir la portée dans laquelle vous pouvez référencer un symbole au-delà de l'unité de compilation où il est déclaré, essentiellement en promettant qu'il sera défini quelque part par quelqu'un.

Vous pouvez également combiner extern avec __attribute__((visibility("hidden"))) pour créer un symbole qui peut être utilisé en dehors de son unité de compilation, mais pas en dehors de son unité de liaison, pour ainsi dire. J'ai utilisé ceci pour du code de bibliothèque et de framework personnalisé afin de bien encapsuler des détails internes de niveau supérieur.

0 votes

Hm.. Mais cela diminue la lisibilité du code si l'utilisation n'est pas documentée dans une plus grande mesure.

0 votes

Y a-t-il un moyen d'utiliser ceci avec une déclaration de classe? (c.-à-d. stackoverflow.com/questions/22798660/…)

0 votes

Aussi considérer FOUNDATION_EXPORT car il fonctionne avec le code C++ également. stackoverflow.com/a/10953284/142358

16voto

weichsel Points 20483

Il existe quelques cas d'utilisation pour le mot-clé extern en Objective-C.
Aaron Hillegass suggère de créer des noms de notification globaux externes. par exemple :

extern NSString* const XYYourNotification;

Vous définissez ensuite le NSString* réel dans votre implémentation

0 votes

Où puis-je trouver plus d'informations sur la suggestion de Hillegass? Connaissez-vous l'URL?

1 votes

J'ai d'abord vu cela dans "Cocoa Programming for Mac OS X" (Aaron Hillegass). L'un des meilleurs livres liés à Cocoa que j'ai lu jusqu'à présent. bignerdranch.com/book/…

0 votes

Pourquoi ai-je besoin d'utiliser extern? Est-ce que je ne peux pas simplement déclarer une variable statique? Merci

10voto

Vladimir Points 110327

Cela dépend de ce pour quoi vous l'utilisez. Il est parfaitement valable de l'utiliser pour accéder à des constantes globalement définies.
Si vous avez un objet global, cependant, je suggère d'utiliser Singleton à la place.

7voto

Sergiu Todirascu Points 1245

Un autre exemple d'un problème lorsque le mot-clé extern n'est pas utilisé :

Disons que vous avez une variable globale dans un fichier d'en-tête :

NSString *globalVar = @"Wonderful";

Et vous l'utilisez à 3 endroits en important ce fichier d'en-tête. Votre code ne compilera pas, le linker se plaignant que vous avez 3 symboles en double définis dans votre code. Pour résoudre ce problème, vous avez deux façons de procéder :

Utiliser static, auquel cas chaque fichier qui importe ce fichier d'en-tête aura sa propre référence définie (et changer une chaîne ne affectera pas les autres chaînes importées dans d'autres fichiers) :

static NSString *globalVar = @"Wonderful";

Utiliser extern dans le fichier .h et le définir dans le fichier .m. De cette façon, il n'y aura qu'une seule référence définie et chaque fichier utilisera cette même référence (les changements étant reflétés dans tous les fichiers) :

extern NSString *globalVar; // dans le .h

NSString *globalVar = @"Wonderful"; // dans le .m

Choisissez l'approche qui convient le mieux.

3voto

Zumry Mohamed Points 31

Dépend de vos besoins, par exemple si vous avez une page de connexion. Après vous être connecté, vous êtes notifié vers d'autres pages dans les applications.

#import 

extern NSString *const DidLoginNotification;

@interface LoginViewController : NSObject
- (void)login;
@end

// LoginViewController.m
#import "LoginViewController.h"

//définissez extern const dans le fichier d'implémentation une seule fois pour l'ensemble du processus
NSString *const DidLoginNotification =
    @"DidLoginNotificationNotified";

@implementation LoginViewController

- (void)login {
    // Effectuer la notification
    [[NSNotificationCenter defaultCenter];
    sendNotificationName: DidLoginNotification
                    object:nil];
}

La partie recevant la notification n'a pas besoin de connaître la valeur de la constante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X