我试图创建一个静态变量来存储图像字典。不幸的是,我能找到的最好的方法是检查使用该变量的每个函数。由于我在类别内创建了此变量,因此我不能仅在初始评估器中将其初始化。是否有一种更整洁的方法来初始化导航栏?

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(), , 像这样:

改变

NSString *imageName=[navigationBarImages objectForKey:self];

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

如果函数调用顶部打扰您,则可以使用临时变量来捕获NavigationBarimages()的返回(),

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

该缺点是您称为navigationbarimages()的一个缺点,就创建了nsmutabledictionary的实例,那么直到程序结束之前,它将永远不会有机会进行交易。

您需要的只是在使用之前将静态设置为已知点。例如,您可以设置NSapplication委托并将其完成工作 -applicationDidFinishLaunching:

一种选择是使用C ++。将文件的扩展名更改为.mm,然后更换 = NULL[[NSMutableDictionary alloc] init].

您可以添加 +initialize 在您类别的.m文件中 - 您只需要确保您不会粉碎现有的实现,否则您将获得一般性的垃圾。 (显然,如果您编写了代码,可以确定这一点,但是使用第三方代码,这可能不是最好的方法。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top