初始化目标-C类中的静态变量
-
20-09-2019 - |
题
我试图创建一个静态变量来存储图像字典。不幸的是,我能找到的最好的方法是检查使用该变量的每个函数。由于我在类别内创建了此变量,因此我不能仅在初始评估器中将其初始化。是否有一种更整洁的方法来初始化导航栏?
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文件中 - 您只需要确保您不会粉碎现有的实现,否则您将获得一般性的垃圾。 (显然,如果您编写了代码,可以确定这一点,但是使用第三方代码,这可能不是最好的方法。)
不隶属于 StackOverflow