在Objective中初始化静态变量

我试图创建一个静态变量来存储图像字典。 不幸的是,我发现初始化它的最好方法是检查每个使用该变量的函数。 由于我在一个类中创建了这个变量,所以我不能在初始化器中初始化它。 是否有一个整洁的方式来初始化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

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

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

这些功能将在程序启动和结束时自动调用。


考虑这种方法,

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

那么无论何时您需要使用navigationBarImages,请用navigationBarImages()替换它,如下所示:

更改

NSString *imageName=[navigationBarImages objectForKey:self];

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

如果函数调用开销困扰你,也许使用临时变量来捕获navigationBarImages()的返回值,

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

缺点是一旦你调用了navigationBarImages(),NSMutableDictionary的实例就被创建了,那么它将永远不会有机会去分配,直到程序结束。


所有你需要的是在使用之前将你的静态设置在已知点。 例如,您可以设置一个NSApplication委托并让它在-applicationDidFinishLaunching:执行工作-applicationDidFinishLaunching:

链接地址: http://www.djcxy.com/p/86797.html

上一篇: Initialising a static variable in Objective

下一篇: GCC compiled assembly