Cuando define una variable fuera del alcance de una función, el valor de esa variable se escribe realmente en su archivo ejecutable. Esto significa que solo puede usar un valor constante. Como no sabe todo sobre el entorno de ejecución en el momento de la compilación (qué clases están disponibles, cuál es su estructura, etc.), no puede crear objetos objetivos c hasta el tiempo de ejecución, con la excepción de las cadenas constantes, a las que se les asigna un valor específico. estructura y garantizado para permanecer de esa manera. Lo que debe hacer es inicializar la variable a cero y usarla +initialize
para crear su imagen. initialize
es un método de clase que se llamará antes de que se llame a cualquier otro método en su clase.
Ejemplo:
NSImage *imageSegment = nil;
+ (void)initialize {
if(!imageSegment)
imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
}
- (id)init {
self = [super init];
if (self) {
}
return self;
}
__attribute__ ((constructor))
.const
de esa manera? ¿Es decir, una variable que solo se puede configurar una vez y nunca más?+initialize
método para diferentes clases, o podría llamar a funciones desde otros archivos, pero debe tener mucho cuidado con cosas como esta. Realmente es mejor evitarlo si es posible.Una variable global debe inicializarse a un valor constante, como
4
o0.0
o@"constant string"
onil
. Un constructor de objetos, comoinit
, no devuelve un valor constante.Si desea tener una variable global, debe inicializarla
nil
y luego devolverla usando un método de clase:NSImage *segment = nil; + (NSImage *)imageSegment { if (segment == nil) segment = [[NSImage alloc] initWithContentsOfFile:@"/user/asd.jpg"]; return segment; }
fuente
Porque le pide al compilador que inicialice una variable estática con código que es inherentemente dinámico.
fuente
La razón es que está definiendo su parte
imageSegment
externa de una función en su código fuente (variable estática).En tales casos, la inicialización no puede incluir la ejecución de código, como llamar a una función o asignar una clase. El inicializador debe ser una constante cuyo valor se conozca en el momento de la compilación.
Luego puede inicializar su variable estática dentro de su
init
método (si pospone su declaración a init).fuente
Ciertamente puede #definir una macro como se muestra a continuación. El compilador reemplazará "IMAGE_SEGMENT" con su valor antes de la compilación. Si bien logrará definir una búsqueda global para su matriz, no es lo mismo que una variable global. Cuando se expande la macro, funciona igual que el código en línea, por lo que se crea una nueva imagen cada vez. Entonces, si tiene cuidado con el lugar donde usa la macro, entonces habría logrado efectivamente crear una variable global.
#define IMAGE_SEGMENT [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
Luego úselo donde lo necesite como se muestra a continuación. Cada vez que se ejecuta el siguiente código, se crea un nuevo objeto con un nuevo puntero de memoria.
imageSegment = IMAGE_SEGMENT
fuente