2009-08-27 7 views
3

J'utilise une variable/propriété de mon délégué d'application en tant que variable globale. (Je ne veux pas traiter une classe singleton.)Tentatives d'accès aux variables/propriétés de délégué d'application

J'essaye d'écrire une instruction #define dans ma classe Delegate d'application. Si je tape:

[UIApplication sharedApplication] 

Dans ma classe de délégué d'application, l'indication de code ne reconnaît pas sharedApplication. Mais si je tape la même chose dans une classe viewController, "sharedApplication" apparaît.

Afin de définir un NSMutableDictionary dans mon applicationDelegate.h (? Ou .M), je vous écris:

#define MyDictionary [[[UIApplication sharedApplication] delegate] stateDictionary] 

Alors si j'essaie de l'utiliser dans une autre classe:

[[MyDictionary objectForKey:@"California"] largestCity]; 

J'obtiens une erreur que MyDictionary doit être déclaré en premier. Je suis vraiment confus au sujet de beaucoup de concepts ici.

Répondre

8

Je suis assez sûr que quelqu'un répondra à ce mieux, mais voici un rapide:

Disons que votre application est appelée monApplication. Attribuer la propriété « globale » à MyApplicationDelegate, puis il sera accessible de partout comme ceci:

// get reference to app delegate 
MyApplicationDelegate *appDelegate = (MyApplicationDelegate *)[[UIApplication sharedApplication] delegate] 

Property *myProperty = appDelegate.property; 

Aussi, assurez-vous que vous établissez un lien vers un fichier MyApplicationDelegate en-tête:

#import "MyApplicationDelegate.h" 

Il y a un débat plus si l'utilisation d'objets "globaux" est bonne en général, mais je ne vais pas y aller maintenant.

+0

Cela fonctionne très bien. Je vous remercie. Est-il possible de le définir afin que je puisse accéder à la variable sans utiliser vos 2 déclarations? Dois-je les libérer? Si je les libérais, libérerait-il mon instance AppDelegates du dictionnaire et du délégué? – Bryan

+0

Aussi, dans la première partie de ma question, quelle est la différence entre les deux appDelegates? – Bryan

+0

Vous devez utiliser ces deux lignes, malheureusement. Je ne connais pas de variables globales réelles, mais encore une fois, je ne les utilise pas dans mon code. :) Libération: libérez-les dans la classe où vous les avez créés. Si vous les avez créés dans MyApplicationDelegate, par exemple, relâchez-les dans la méthode dealloc. Question de délégué de l'application: commencez une nouvelle question de stackoverflow. :) C'est un sujet qui lui est propre ... – Rudi

2

-je ajouter toujours une catégorie à UIApplication comme celle-ci:

@interface UIApplication (MyAppDelegate) 
+(MyAppDelegate*)sharedMyAppDelegate; 
@end 

De cette façon, je n'ai pas à vous soucier du tout le type jette. Je définis et implémente souvent cette catégorie dans le même fichier que la classe MyAppDelegate elle-même. Donc, c'est l'en-tête I #import partout. Tout ce que vous pouvez ajouter à votre fichier MyProject_Prefix.chp.

Singletons ne sont pas mauvais, si votre architecture est correctement couche (Et oui, il est entièrement testable).

Questions connexes