Pregunta

Estaba tratando de crear una variable estática para almacenar un diccionario de imágenes. Desafortunadamente, la mejor manera que pude encontrar para inicializarlo fue verificar en cada función que usara la variable. Como estoy creando esta variable dentro de una categoría, no puedo inicializarla dentro del Inicialador. ¿Hay una forma más ordenada de inicializar las barimagen de navegación?

static NSMutableDictionary *navigationBarImages = NULL;

@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image
- (void)drawRect:(CGRect)rect
{
    if(navigationBarImages==NULL){
        navigationBarImages=[[NSMutableDictionary alloc] init];
    }
    NSString *imageName=[navigationBarImages objectForKey:self];
    if (imageName==nil) {
        imageName=@"header_bg.png";
    }
    UIImage *image = [UIImage imageNamed: imageName];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
    if(navigationBarImages==NULL){
        navigationBarImages=[[NSMutableDictionary alloc] init];
    }
    [navigationBarImages setObject:image forKey:self];
}
@end
¿Fue útil?

Solución

__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}

Esta función se llamará automáticamente cuando el programa inicie y termine.

Otros consejos

Considere este enfoque,

static NSMutableDictionary *navigationBarImages()
{
    static NSMutableDictionary *dict = NULL;
    if(dict == NULL)
    {
        dict = [[NSMutableDictionary alloc] init];
    }
    return [[dict retain] autorelease];
}

Entonces, siempre que uses navegación barimages, reemplácelo con NavigationBarImages (), como esto:

cambio

NSString *imageName=[navigationBarImages objectForKey:self];

a

NSString *imageName=[navigationBarImages() objectForKey:self];

Si la función de llamada de función lo molesta, tal vez use una variable temporal para detectar la devolución de NavigationBarImages (),,,,

NSMutableDictionary *dict = navigationBarImages();
[dict doSomething];
[dict doSomething];

El inconveniente es una vez que llamó NavigationBarImages (), la instancia de NSMUTABLED se creó, entonces nunca tendrá la oportunidad de DealLoc hasta el final del programa.

Todo lo que necesita es establecer su estática una vez en un punto conocido antes de que se use. Por ejemplo, puede establecer un delegado NSAPPLICATION y hacer que haga el trabajo en -applicationDidFinishLaunching:

Una opción es usar C ++. Cambie la extensión del archivo a .mm y reemplace = NULL con [[NSMutableDictionary alloc] init].

Podrías agregar +initialize En el archivo .m de su categoría: solo tendrá que asegurarse de que no está aplastando una implementación existente o obtendrá una cantidad de cantidad general. (Obviamente, puede estar seguro de esto si escribió el código, pero con el código de terceros, este probablemente no sea el mejor enfoque).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top