Инициализация статической переменной в категории 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) {
        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
9
задан Quinn Taylor 12 January 2010 в 03:35
поделиться

5 ответов

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

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

Эта функция будет автоматически вызываться, когда программа запускается и заканчивается.

25
ответ дан 4 December 2019 в 06:26
поделиться

Все, что вам нужно, это установить статический один раз в известную точку до его использования. Например, вы можете установить делегат NSApplication и у него есть работа в -АкплиционированииDIDFINISHLAUCHING:

2
ответ дан 4 December 2019 в 06:26
поделиться

Одним из вариантов является использование C ++. Измените расширение файла до .mm и замените = NULL с [[NSMutabledIctionAry Alloc] init] .

1
ответ дан 4 December 2019 в 06:26
поделиться
-

Вы можете добавить + инициализировать в файле .m вашей категории - вам просто нужно убедиться, что вы не разбите существующую реализацию или вы получить общую вонючую. (Очевидно, вы можете быть уверены в этом, если вы написали код, но со сторонним кодом, это, вероятно, не самый лучший подход.)

0
ответ дан 4 December 2019 в 06:26
поделиться

Рассмотрим этот подход,

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

, тогда всякий раз, когда вы будете использовать NavipationBarimage , замените его NavigationBirimage () , как это:

Изменение

NSString *imageName=[navigationBarImages objectForKey:self];

на

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

Если накладные расходы на вызов функции беспокоит вас, возможно, используйте временную переменную, чтобы поймать возврат навигации (),

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

Недостаток, как только вы называете NavIcationBirImimages (), экземпляр NSMutballySasionAry был создан, то он никогда не получит возможности Dealoc до конца программы.

10
ответ дан 4 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: