2009-12-29 4 views
0

Je construis un framework Xcode personnalisé, et j'ai une classe appelée AXController qui a une méthode de classe appelée showActivationWindow. showActivationWindow initialise et affiche une fenêtre en utilisant AXWindowController qui est une sous-classe de NSWindowController. Ensuite, AXWindowController appelle activate qui est une méthode de classe dans AXController sur un bouton appuyer dans la fenêtre qu'il affiche.Un bon moyen de structurer les classes dans le framework Xcode

I inclus dans AXWindowController.hAXController.h et inclus dans AXController.hAXWindowController.h si chacun pouvait accéder à des méthodes de l'autre, mais cela jette beaucoup d'avertissements Xcode. Cela semble aussi une solution très inélégante.

Quelle est la bonne façon de résoudre ce problème?

Répondre

3

Ce n'est pas une bonne idée d'importer des fichiers d'en-tête de manière récursive. Il y a une directive @class(link to Apple doc) qui indique qu'une classe est nommée comme telle. En pratique, l'utilisation est quelque chose comme A.h

@class B; 
@interface A:NSObject { 
    B* anInstanceOfB; 
} 
... 
@end 

et B.h

#import "A.h" 
@interface B:NSObject { 
    A* anInstanceOfA; 
} 
... 
@end 

Vous pouvez ensuite importer A.h et B.h que vous le souhaitez à partir de votre fichier .m! Mais attention à ne pas faire de cycle de conservation, si vous n'utilisez pas la récupération de place.

+0

Merci pour votre réponse. J'ai changé mon code pour utiliser '@ class'. Mais je reçois encore des avertissements impliquant ce qui suit: En classe A, j'ai 'NSString * appName statique ';' en dehors de '@ interface', et maintenant je reçois un avertissement qui dit" appName "défini mais non utilisé." Que signifie cet avertissement et pourquoi le reçois-je? – Chetan

+0

Vous pouvez apprendre à déclarer des variables globales en C. Ce lien http://stackoverflow.com/questions/496448/comment-utiliser- correctement-le-exter-keword-in-c pourrait être utile. En un mot, dans 'Ah', écrivez' extern NSString * appName; ' Dans' Am', écrivez '#import" Ah "' et ensuite 'NSString * appName;' Enfin, si vous voulez vous référer à appName de 'Bh', faites simplement' #import "Ah" 'dans' Bh'. Je suppose que vous voulez avoir une variable de classe comme C++, mais 'static' en C ou Objective-C est quelque chose de différent, et cela fonctionne différemment. – Yuji

+0

En fait, après quelques recherches, la façon correcte de déclarer les variables au niveau de la classe est la suivante: 'static NSString * myString' dans A.m. Référence: http://stackoverflow.com/questions/1063229/objective-c-static-class-level-variables – Chetan

Questions connexes