Inicjalizacja zmiennej statycznej w kategorii Objective-C

Próbowałem stworzyć zmienną statyczną do przechowywania słownika obrazów. Niestety, najlepszym sposobem, jaki mogłem znaleźć, aby go zainicjować, było sprawdzenie w każdej funkcji, która używała zmiennej. Ponieważ tworzę tę zmienną wewnątrz kategorii, nie mogę po prostu zainicjować jej wewnątrz inicjalizatora. Czy istnieje lepszy sposób inicjowania 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
Author: Quinn Taylor, 2010-01-12

5 answers

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

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

Te funkcje będą wywoływane automatycznie po uruchomieniu i zakończeniu programu.

 24
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 06:00:13

Rozważ to podejście,

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

Wtedy, gdy chcesz użyć navigationBarImages , zastąp go navigationBarImages () , Tak:

Zmień

NSString *imageName=[navigationBarImages objectForKey:self];

Do

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

Jeśli wywołanie funkcji napowietrznej przeszkadza, może użyć zmiennej tymczasowej, aby złapać powrót funkcji navigationBarImages (),

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

Wadą jest to, że po wywołaniu navigationBarImages () instancja NSMutableDictionary została utworzona, wtedy nigdy nie będzie miała szansy na dealloc do końca programu.

 10
Author: yehnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 03:27:34

Wszystko, czego potrzebujesz, to ustawić statyczny raz w znanym punkcie, zanim zostanie użyty. Na przykład, możesz ustawić delegata Nsapply i zlecić mu wykonanie pracy w -applicationDidFinishLaunching:

 2
Author: Jon Reid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 03:10:05

Jedną z opcji jest użycie C++. Zmień rozszerzenie pliku NA. mm i zastąp = NULL na [[NSMutableDictionary alloc] init].

 1
Author: Marcelo Cantos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 03:00:00

Możesz dodać +initialize w ...M Plik z twojej kategorii - musisz tylko upewnić się, że nie rozwalasz istniejącej implementacji, bo dostaniesz ogólne wonności. (Oczywiście, możesz być tego pewien, jeśli napisałeś kod, ale w przypadku kodu innych firm, to prawdopodobnie nie jest to najlepsze podejście.)

 0
Author: Quinn Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 04:34:19