Question

J'essayais de créer une variable statique pour stocker un dictionnaire d'images. Malheureusement, la meilleure façon de trouver pour initialiser était de vérifier chaque fonction qui a utilisé la variable. Comme je crée cette variable dans une catégorie, je ne peux pas simplement l'initialiser à l'intérieur de l'initialisateur. Existe-t-il une façon plus nette d'initialiser les barimages de navigation?

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
Était-ce utile?

La solution

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

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

Cette fonction sera appelée automatiquement lorsque le programme démarre et se termine.

Autres conseils

Considérez cette approche,

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

Ensuite, chaque fois que vous utilisiez Navigation Barimages, remplacez-le par NavigationBarimages (), comme ça:

monnaie

NSString *imageName=[navigationBarImages objectForKey:self];

à

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

Si l'appel de fonction vous dérange, utilisez peut-être une variable temporaire pour attraper le retour de NavigationBarimages (),

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

L'inconvénient est une fois que vous avez appelé NavigationBarimages (), l'instance de NSMutablectionary a été créée, alors elle n'aura jamais la chance de Dealloc jusqu'à la fin du programme.

Tout ce dont vous avez besoin est de régler votre statique une fois à un point connu avant son utilisation. Par exemple, vous pouvez définir un délégué NSApplication et le faire faire le travail dans -applicationDidFinishLaunching:

Une option consiste à utiliser C ++. Modifiez l'extension du fichier en .mm et remplacez = NULL avec [[NSMutableDictionary alloc] init].

Tu pourrais ajouter +initialize Dans le fichier .m de votre catégorie - vous devrez simplement vous assurer que vous ne brissez pas une implémentation existante ou vous obtiendrez General Wonkiness. (Évidemment, vous pouvez être sûr de cela si vous avez écrit le code, mais avec le code tiers, ce n'est probablement pas la meilleure approche.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top