Frage

Ich habe versucht, eine statische Variable zu erstellen, um ein Wörterbuch mit Bildern zu speichern. Leider war es die beste Art und Weise, wie ich feststellen konnte, dass es in jeder Funktion einchecken, die die Variable verwendete. Da ich diese Variable in einer Kategorie erstelle, kann ich sie nicht einfach im Initialiser initialisieren. Gibt es eine teatere Art, Navigationsbarimages zu initialisieren?

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
War es hilfreich?

Lösung

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

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

Diese Funktion wird automatisch aufgerufen, wenn das Programm startet und endet.

Andere Tipps

Betrachten Sie diesen Ansatz,

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

dann wann immer Sie verwenden würden NavigationScharnagen, ersetzen Sie es durch NavigationBarimages (), so was:

Rückgeld

NSString *imageName=[navigationBarImages objectForKey:self];

zu

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

Wenn der Funktionsaufruf Sie stört, verwenden Sie möglicherweise eine vorübergehende Variable, um die Rückgabe von NavigationBarimages () zu erfassen.

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

Der Nachteil ist, dass Sie NavigationBarimages () angerufen haben, die Instanz von NSMutabledictionary erstellt wurde, und dann wird es bis zum Ende des Programms niemals die Chance zum Operation bekommen.

Alles, was Sie brauchen, ist, Ihre Statik einmal an einem bekannten Punkt einzustellen, bevor es verwendet wird. Sie können beispielsweise einen NSapplication -Delegierten festlegen und die Arbeit in der Arbeit erledigen lassen -applicationDidFinishLaunching:

Eine Option ist die Verwendung von C ++. Ändern Sie die Erweiterung der Datei in .mm und ersetzen Sie = NULL mit [[NSMutableDictionary alloc] init].

Sie könnten hinzufügen +initialize In der .m -Datei Ihrer Kategorie müssen Sie nur sicherstellen, dass Sie keine vorhandene Implementierung zerschlagen, oder Sie erhalten allgemeine Wonkiness. (Natürlich können Sie dies sicher sein, wenn Sie den Code geschrieben haben, aber mit Code von Drittanbietern ist dies wahrscheinlich nicht der beste Ansatz.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top