2012-02-11 2 views
1

La classe A a un format UII.Utilisation incorrecte de variables statiques?

classe B a une référence statique à une classe de type A.

Avant la classe B est instancié, je veux appeler une méthode statique dans la classe B pour assigner une instance de la classe A.

+ (void)setClassAReference:(ClassA*)classA 
{ 
    classA_ = classA; 
} 

Est-ce possible? Avant de plonger dans mon projet actuel, j'ai créé un exemple, et j'ai pu définir une valeur entière, puis instancier B avec lui en gardant la valeur stockée et en permettant l'accès à celui-ci.

Cependant, dans mon projet actuel, XCode refuse de me permettre de passer une valeur entière:

méthode non-statique en classe A:

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type 

Après la classe B est instancié, je tente de appeler une méthode dans A:

UIImage *img = [classA_ imageWithIdentifier:ImageIdentifier_Foo]; 

Mais j'obtiens un avertissement de conversion implicite. L'auto-complète montre (id) au lieu de (ImageIdentifier). J'ai triplé toutes mes signatures de méthodes et toutes utilisent le type enum. Est-ce que j'utilise incorrectement des variables statiques ou y a-t-il un autre problème? Je réalise que je pourrais utiliser un singleton, mais je préférerais ne pas le faire si possible.

J'ajoute la déclaration enum ici: *

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

vrais noms * changés pour protéger les innocents.

+0

Pourquoi le _class_ 'B' doit-il avoir une référence à une instance de A avant qu'une instance de B soit créée? Chaque instance de 'B' aura alors l'instance _same_ de' A'. –

+0

'A' contient quelques images différentes utilisées par plusieurs sous-classes de 'B.' Je veux rendre les classes réutilisables, de sorte que chaque application puisse avoir des noms d'images différents. Je veux éviter que chaque sous-classe n'envoie le même nom d'image à chaque fois que l'on est créé en ne l'envoyant qu'une fois dans une méthode statique. – TigerCoding

Répondre

2

Tout d'abord ...

Si vous souhaitez initialiser les variables statiques sur une classe avant qu'elle ne soit vous instancié utiliser la méthode de classe sur NSObject

+ (void) initialize 

C'est là que vous pouvez affecter à votre variable ClassA statique en ClassB.

.... En second lieu

Assurez-vous de conserver cette variable CLASSA, sinon il sera libéré.

Troisièmement .....

En ce qui concerne votre conversion implicite ... ce qui est variable 'a', au-dessus cela vous écrit classA_. Pouvez-vous montrer votre déclaration enum. Avez-vous importé ClassA?

Je n'ai aucune erreur de compilation avec ceci:

ClassA.h

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

@interface ClassA : NSObject 

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type 

@end 

ClassA.m

#import "ClassA.h" 

@implementation ClassA 

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier { 
    return nil; 
} 

@end 

ClassB.h

@interface ClassB : NSObject 

@end 

ClassB.m

#import "ClassB.h" 
#import "ClassA.h" 

static ClassA *classA; 

@implementation ClassB 

+ (void) initialize { 
    classA = [[ClassA alloc] init]; 
} 

- (void) doSomething { 
    UIImage *image = [classA imageWithIdentifier:ImageIdentifier_Foo]; 
    NSLog(@"image %@", image); 
} 

@end 
+0

La classe A possède sa propre méthode init, qui appelle [super init] comme n'importe quelle autre classe. Je ne retiens pas, parce que j'utilise l'ARC. J'ai fait une erreur dans mon code, j'ai changé le nom de la variable pour 'a'. Oui, la classe avec les noms de types est importée. Bizarrement, dans la classe A, je vois maintenant des erreurs dans les signatures de méthode d'interface 'Attendant un type' mais l'en-tête du type est importé et le nom du type est en bleu, montrant clairement que le compilateur reconnaît le nom du type. Ajoutez la déclaration d'énumération ci-dessus. Ce que je fais devrait être possible? Peut-être que XCode est bizarre? – TigerCoding

+0

Merci pour votre aide. Cela me rendait fou. – TigerCoding

+0

Marqué le vôtre correct que vous avez clairement montré qu'il pourrait être fait. – TigerCoding

0

L'erreur se est éclairci. J'importais la classe A dans le fichier .h de la classe B. Il était également importé dans le fichier .m de la classe B. J'ai supprimé l'importation dans le fichier .h et l'ai modifié en @class ClassA et tout automagiquement résolu lui-même.

Est-ce qu'une référence circulaire aurait causé cela?

+0

Ne le pense pas. J'ai juste essayé avec mon code d'exemple et toujours aucun problème. – bandejapaisa

+0

Je pense que Xcode vient de se faire gâcher alors (ce ne serait pas la première fois). Merci de votre aide. – TigerCoding