Инициализация статической переменной в категории Objective-C
Я пытался создать статическую переменную для хранения словаря изображений. К сожалению, лучший способ, который я мог найти для его инициализации, - проверить каждую функцию, использующую переменную. Поскольку я создаю эту переменную внутри категории, я не могу просто инициализировать ее внутри инициализатора. Есть ли более простой способ инициализации 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) {
[email protected]"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
Ответы
Ответ 1
__attribute__((constructor))
static void initialize_navigationBarImages() {
navigationBarImages = [[NSMutableDictionary alloc] init];
}
__attribute__((destructor))
static void destroy_navigationBarImages() {
[navigationBarImages release];
}
Эта функция будет вызываться автоматически при запуске и завершении программы.
Ответ 2
Рассмотрим этот подход,
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 создан, тогда он никогда не получит возможность dealloc до конца программы.
Ответ 3
Все, что вам нужно, - установить статический один раз в известном месте до его использования. Например, вы можете установить делегат NSApplication и выполнить его в -applicationDidFinishLaunching:
Ответ 4
Один из вариантов - использовать С++. Измените расширение файла на .mm и замените = NULL
на [[NSMutableDictionary alloc] init]
.
Ответ 5
Вы можете добавить +initialize
в .m файл вашей категории - вам просто нужно убедиться, что вы не разрушая существующую реализацию, или вы получите общее недоумение. (Очевидно, вы можете быть уверены в этом, если бы вы написали код, но с сторонним кодом, это, вероятно, не самый лучший подход.)