26 votes

Variable de chaîne statique dans Objective C sur iphone

Comment créer et accéder à une chaîne statique dans l'iPhone (objectif c)? Je déclare static NSString *str = @"OldValue" en classe A.

Si j'attribue une valeur à cela dans la classe B comme str = @"NewValue" . Cette valeur persiste pour toutes les méthodes de la classe B. Mais si j'y accède dans la classe C (après l'affectation en B), je l'obtiens en tant que OldValue. Suis-je en train de manquer quelque chose? Dois-je utiliser extern dans d'autres classes?

Merci et salutations, Yogini

44voto

zpasternack Points 10563

Objective-C n'a pas de variables de classe, c'est ce que je pense que vous recherchez. Vous pouvez le simuler avec des variables statiques, comme vous le faites.

Je recommanderais de mettre la NSString statique dans le fichier d'implémentation de votre classe et de fournir des méthodes de classe pour y accéder / muter. Quelque chose comme ça:

 // MyClass.h
@interface MyClass : NSObject {
}
+ (NSString*)str;
+ (void)setStr:(NSString*)newStr;
@end

// MyClass.m
#import "MyClass.h"

static NSString* str;

@implementation MyClass

+ (NSString*)str {
    return str;
}

+ (void)setStr:(NSString*)newStr {
    if (str != newStr) {
    	[str release];
    	str = [newStr copy];
    }
}
@end
 

30voto

Quinn Taylor Points 29688

Contrairement à Java, où une variable statique est définie pour toutes les instances d'une classe, static C signifie qu'une variable est accessible qu'à partir dans le fichier dans lequel elle est déclarée. Il vous permet de faire des choses comme déclarer une variable statique à l'intérieur d'une fonction, qui définit la valeur que la première fois, comme ça.

Une chose que vous n'avez pas mentionné, c'est la relation entre les classes A, B, et C. Si ils sont dans une hiérarchie d'héritage, et vous vous attendez de la variable statique à être héréditaire, comme en Java, la méthode décrite par zpasternack fonctionne.

Si les trois classes sont indépendants, et vous voulez juste pour accéder à la valeur déclarée dans Une, alors extern est un plus appropriés. Dans ce cas, vous voulez déclarer la variable comme extern de ClassA.h, puis de le définir dans la Classe.m. Aussi longtemps que ClassB et ClassC importation ClassA.h, ils seront en mesure de relier à l'encontre de la même extern définition.

Un bon point est que, au lieu d'utiliser extern par lui-même, il est plus robuste à utiliser OBJC_EXPORT, qui est défini dans l'objc-api.h et gère la compilation sous C++. Voici un exemple de code:

// ClassA.h
OBJC_EXPORT NSString* commonString;
...

// ClassA.m
NSString* commonString = @"OldValue";

// ClassB.m
#import "ClassA.h"
...
commonString = @"NewValue"; // Can be inside a function or method

Bien sûr, l'aide externed variables de cette façon crée un infâme, tant décrié variable globale, qui est fragile en ce que quelqu'un peut le lire ou l'écrire, et l'accès est contrôlé. C'est l'approche simple, et les réponses à vos question sur l'utilisation d' static vs extern. Cependant, comme un principe de conception, l'encapsulation fournis par emballage de la variable avec les méthodes de la classe est beaucoup plus sûr, mais plus complexe. Dans les langages orientés objet, lorsque l'effet que vous essayez d'atteindre est celui d'une classe-méthode statique, l'encapsulation est probablement la bonne façon de faire.

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