Domanda

Stavo cercando di creare una variabile statica per archiviare un dizionario di immagini. Sfortunatamente, il modo migliore che ho potuto trovare per inizializzare è stato quello di controllare ogni funzione che utilizzava la variabile. Dal momento che sto creando questa variabile all'interno di una categoria, non riesco a inizializzarla all'interno del iniziativa. Esiste un modo più ordinato di inizializzare le barriere di navigazione?

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
È stato utile?

Soluzione

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

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

Queste funzione verranno chiamate automaticamente quando il programma avvia e termina.

Altri suggerimenti

Considera questo approccio,

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

Quindi ogni volta che useresti NavigationBarimages, sostituirlo con NavigationBarImages (), come questo:

modificare

NSString *imageName=[navigationBarImages objectForKey:self];

a

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

Se la chiamata della funzione Overhead ti disturba, forse utilizzare una variabile temporanea per catturare il ritorno di NavigationBarImages (),

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

Lo svantaggio è una volta che hai chiamato NavigationBarimages (), l'istanza di NSMUABLABLECTICTICO è stata creata, quindi non avrà mai la possibilità di dealloc fino alla fine del programma.

Tutto ciò che serve è impostare la tua statica una volta in un punto noto prima che venga utilizzato. Ad esempio, è possibile impostare un delegato NSApplication e farlo fare il lavoro -applicationDidFinishLaunching:

Un'opzione è usare C ++. Modificare l'estensione del file in .mm e sostituire = NULL insieme a [[NSMutableDictionary alloc] init].

Potresti aggiungere +initialize Nel file .m della tua categoria: dovrai solo assicurarti di non distruggere un'implementazione esistente o otterrai una conghiltà generale. (Ovviamente, puoi esserne sicuro se hai scritto il codice, ma con il codice di terze parti, questo non è probabilmente l'approccio migliore.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top