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 +initializepara crear su imagen. initializees 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)).constde esa manera? ¿Es decir, una variable que solo se puede configurar una vez y nunca más?+initializemé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
4o0.0o@"constant string"onil. Un constructor de objetos, comoinit, no devuelve un valor constante.Si desea tener una variable global, debe inicializarla
nily 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
imageSegmentexterna 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
initmé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_SEGMENTfuente