2011-10-31 4 views
19

Tengo una aplicación iOS construida desde el principio con un error en ella. Desde que se inició la fuente construida a partir del molde, su appdelegate.h parece:No se puede declarar la variable dentro de @interface o @protocol

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    myViewController *viewController; 
} 

BOOL  myBool;  // intended to be globally accessible 
NSString *myString; // intended to be globally accessible 

@end 

Me refiero a myBool y * miCadena de muchos otros archivos de origen .m, en cuanto a las variables globales.

Debajo de XCode 3.2.6, no recuerdo haber tenido problemas en tiempo de compilación.

En 3.2.6, apareció una advertencia en la compilación señalando estas variables "globales" en appdelegate.h, diciendo: "No se puede declarar la variable dentro de @interface o @protocol". Como no hubo más problemas con la compilación o durante el tiempo de ejecución de la aplicación, lamentablemente no consideré estas advertencias.

Ahora, utilizando XCode 4.2, no puedo compilar esta fuente, porque las advertencias anteriores se convirtieron en errores de compilación. Se refieren y señalan cada una de esas líneas en los diferentes archivos .m donde hay una referencia a las "variables globales".

¿Existe una manera fácil de corregir este problema, teniendo en cuenta que todavía quiero acceder a estas variables/referencias como globales?

pregunta adicional: mientras yo estoy evaluando las respuestas recibidas hasta la fecha (gracias por todos ustedes), otra pregunta: idea de por qué ninguna advertencia se da a continuación v3.2.6 XCode, y sólo advertencias en 3.2.6 si esto ¿Es un error real de mi parte? ¿Y por qué el código todavía se compiló y podría ejecutarse sin ningún problema?

+0

Como una palabra de precaución, las variables "globales" en este sentido son por lo general una mala idea en programación orientada a objetos, ya que van en contra de localidad y encapsulación. Hay mucha lectura en línea sobre este tema. –

Respuesta

30

No pueden ir allí.Usted puede poner dentro de las llaves {} como este:

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    myViewController *viewController; 
BOOL  myBool;  // intended to be globally accessible 
NSString *myString; // intended to be globally accessible 
} 

@end 

Y eso los hace global a la clase de implementación. Pero si usted quiere que global para todas las clases en su aplicación, entonces debería dejarlos en su archivo de App-Prefix.pch:

// 
// Prefix header for all source files of the ... project 
// 
#import <Availability.h> 
BOOL  myBool;  // intended to be globally accessible 
NSString *myString; // intended to be globally accessible 
#ifndef __IPHONE_3_0 
+1

Lo que finalmente hice fue crear un archivo separado "global_variables.h", poner todas estas variables en él e incluirlo en el appdelegate.h con #import, ¡y funciona! :) – cactusdev

+0

Esta es honestamente la mezcla de sintaxis más fea que he visto en mi vida. Entiendo que son banderas de precompiladores, pero es un desastre. – Sirens

1

C Las variables globales deben declararse en archivos de implementación .m, no en archivos de encabezado .h. Una declaración externa puede ir en los archivos de cabecera .h, generalmente después de las declaraciones de interfaz y fuera de las interfaces.

También es una buena práctica inicializar punteros de objeto global a nulo, o de lo contrario podrían contener una referencia de objeto de basura.

3

El compilador se queja de las variables que están en el bloque @interface, por lo que los mueve fuera de él, ya sea por encima de la @interface o por debajo de @end. Probablemente quieras cambiarlos a extern s en el encabezado y realmente declararlos en el archivo .m.

10

¿Está tratando de definirlos como miembros públicos en una clase? Las clases en Objective-C son bastante diferentes a las de otros idiomas con los que puedes estar familiarizado. Fuera de las llaves, solo puedes definir métodos. Si desea hacer un miembro de acceso público, definirlos como propiedades:

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    myViewController *viewController; 
    BOOL _myBool; 
    NSString *_myString; 
} 

@property BOOL  myBool;  // intended to be globally accessible 
@property NSString *myString; // intended to be globally accessible 

@end 

Luego, en su @implementation hacer algo como:

@implementation myAppDelegate 
@synthesize myBool = _myBool; 
@synthesize myString = _myString; 

A continuación, puede acceder a ellos como myObject.myBool y así sucesivamente.

Si solo intenta convertirlos en datos estáticos ("globales") para todas las instancias de la clase, como lo han dicho otros carteles, desea mover la definición a su archivo .m (y lo ideal es declararlos static para que no causen problemas de enlace).

+0

Estoy tratando de ponerlos a disposición para todas las clases en el proyecto (es por eso que digo "global"). Así que quiero que sean accesibles desde todos los archivos .m. – cactusdev

+2

Está bien, entonces lo que probablemente quiera hacer a la larga es colocarlos en su archivo .h fuera de cualquier '@ interface' etc. y declararlos' extern', y luego tener un archivo fuente coincidente que declare las variables en sí (sin ningún modificador). Si solo los declaras no externos en tu .h, es posible que te topes con problemas de enlaces. – fluffy

Cuestiones relacionadas