2012-05-04 24 views
7

Estoy usando el objeto Delegado de aplicación en diferentes clases. Quiero acceder a él en todo el proyecto. Estoy definir este objeto en el archivo Prefix.pch comoUsar #define para acceder a App Delegate Object no funciona

#define Appdelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] 

pero el problema es que la variable AppDelegate no tiene acceso a la variable delegado de la aplicación. muestra un error.

pero si mañana el uso de este código funciona bien

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.variablename; 

lo estoy haciendo correctamente o hay una manera de hacer lo que hago?

gracias en Advance.

Respuesta

15

debe ser:

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 
//     ^----------------------parenthesis--------------------------^ 
+5

Sí. Con su '# define', hacer' [Appdelegate variablename] 'funcionaría, pero no' Appdelegate.variablename'. Porque si omites el paréntesis externo, el molde a '(AppDelegate *)' se haría sobre la expresión completa, en este caso tu 'nombre de variable'. – Cyrille

+1

gracias Sharet, está funcionando bien ahora. – Bond

1

Como esta pregunta y sus respuestas demuestran, apoyándose en el preprocesador es generalmente una mala idea.

  1. Es fácil hacer las cosas mal. Todos desarrollamos buenos instintos para la precedencia del operador, pero el preprocesador no tiene ni idea. Para defenderse de los problemas de contexto inesperados, a menudo necesita envolver todo en paréntesis y llaves adicionales.

  2. Es fácil convencerse de que está haciendo una cosa cuando el código está haciendo otra. Cuando las cosas se rompen, ni los mensajes de error del compilador ni el depurador pueden ayudar mucho.

  3. Lo más importante, el preprocesador puede permitirle tomar una mala idea y difundirla de forma generalizada a través del programa. La mala idea aquí es usar el delegado de la aplicación globalmente.

Las variables globales son un olor a código. Los esfuerzos para hacer que las variables globales sean aún más globales metiéndolas en encabezados precompilados son un olor a código. Si el framework pensó que debería tener acceso a AppDelegate desde cualquier lugar, ¡no necesitaría pasar por estos aros (modestos)!

Por lo tanto, cuando tengas la tentación de hacer algo como esto, es bueno saber que el preprocesador está allí y los encabezados de pch están ahí, pero ten en cuenta que estás luchando contra el framework y casi seguramente cometiendo un error de diseño. Eso podría estar bien en tu contexto, pero es algo que debes saber.

2

necesita importar archivos AppDelegate donde se encuentre declarar delegado macro:

importación "AppDelegate.h"

y luego definir

definir AppDelegate (((AppDelegate *) [[UIApplication sharedApplication ] delegar]))

Cuestiones relacionadas