Objective-C kategorisinde statik bir değişkeni başlatma

bir resim sözlüğü depolamak için statik bir değişken oluşturmaya çalışıyordum. Ne yazık ki, başlatmak için bulabildiğim en iyi yol, değişkeni kullanan her işlevi kontrol etmekti. Bu değişkeni bir kategori içinde oluşturduğumdan, başlatıcı içinde başlatamıyorum. NavigationBarİmages başlatmanın daha düzgün bir yolu var mı?

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
9
tarihinde sordu Quinn Taylor 2010-01-12 05:58:19
kaynak

5 ответов

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

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

program başladığında ve bittiğinde bu işlev otomatik olarak çağrılır.

24
cevap kennytm 2010-01-12 09:00:13
kaynak

bu yaklaşımı düşünün,

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

sonra navigationBarİmages kullanmak woulde zaman, navigationBarİmages() ile değiştirin, şöyle:

değiştir

NSString *imageName=[navigationBarImages objectForKey:self];

-

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

işlev çağrısı yükü sizi rahatsız ediyorsa, belki de navigationBarİmages (),

geri dönüşünü yakalamak için geçici bir değişken kullanın
NSMutableDictionary *dict = navigationBarImages();
[dict doSomething];
[dict doSomething];

dezavantajı, navigationBarİmages () olarak adlandırdığınızda, NSMutableDictionary örneği oluşturulduktan sonra, programın sonuna kadar dealloc yapma şansı elde edemezsiniz.

10
cevap yehnan 2010-01-12 06:27:34
kaynak

ihtiyacınız olan tek şey, kullanılmadan önce statik bir kez bilinen bir noktada ayarlamaktır. Örneğin, bir NSApplication temsilci ayarlayabilir ve -applicationDidFinishLaunching:

işi yapmak zorunda
2
cevap Jon Reid 2010-01-12 06:10:05
kaynak

bir seçenek C ++ kullanmaktır. Dosyanın uzantısını değiştirin .mm ve = NULL ile [[NSMutableDictionary alloc] init] değiştirin .

1
cevap Marcelo Cantos 2010-01-12 06:00:00
kaynak

+initialize ekleyebilirsiniz .m file of your category-sadece varolan bir uygulama çökertilmesi değil emin olmak gerekir ya da genel wonkiness alırsınız. (Açıkçası, kodu yazdıysanız bundan emin olabilirsiniz, ancak üçüncü taraf koduyla, bu muhtemelen en iyi yaklaşım değildir.)

0
cevap Quinn Taylor 2010-01-12 07:34:19
kaynak