Cas*_*ash 9 initialization objective-c static-variables categories
我试图创建一个静态变量来存储图像字典.不幸的是,我可以找到初始化它的最好方法是检入使用该变量的每个函数.由于我在一个类别中创建了这个变量,我不能只在初始化器中初始化它.有没有更简洁的初始化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
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 25
__attribute__((constructor))
static void initialize_navigationBarImages() {
navigationBarImages = [[NSMutableDictionary alloc] init];
}
__attribute__((destructor))
static void destroy_navigationBarImages() {
[navigationBarImages release];
}
Run Code Online (Sandbox Code Playgroud)
程序启动和结束时将自动调用这些函数.
yeh*_*nan 10
考虑这种方法,
static NSMutableDictionary *navigationBarImages()
{
static NSMutableDictionary *dict = NULL;
if(dict == NULL)
{
dict = [[NSMutableDictionary alloc] init];
}
return [[dict retain] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
然后每当你使用navigationBarImages时,将其替换为navigationBarImages(),如下所示:
更改
NSString *imageName=[navigationBarImages objectForKey:self];
Run Code Online (Sandbox Code Playgroud)
至
NSString *imageName=[navigationBarImages() objectForKey:self];
Run Code Online (Sandbox Code Playgroud)
如果函数调用开销困扰你,可能使用临时变量来捕获navigationBarImages()的返回,
NSMutableDictionary *dict = navigationBarImages();
[dict doSomething];
[dict doSomething];
Run Code Online (Sandbox Code Playgroud)
缺点是一旦你调用了navigationBarImages(),就会创建NSMutableDictionary的实例,那么在程序结束之前它永远不会有dealloc的机会.