Initialising a static variable in Objective-C category

categories, initialization, objective-c, static-variables

Solution

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

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

These function will be called automatically when the program starts and ends.

Problem

I was trying to create a static variable to store a dictionary of images. Unfortunately, the best way I could find to initialise it was to check in each function that used the variable. Since I am creating this variable inside a category, I can't just initialise it inside the initialiser. Is there a neater way of initialising navigationBarImages? ``` 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 ```

Original source