سؤال

كنت أحاول إنشاء متغير ثابت لتخزين قاموس الصور. لسوء الحظ، فإن أفضل طريقة يمكنني أن أجدها هي التحقق منها في كل وظيفة تستخدم المتغير. منذ أن أقوم بإنشاء هذا المتغير داخل فئة، لا أستطيع تهيئةها فقط داخل المهيئ. هل هناك طريقة نيت ل تهائم التنقل؟

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
هل كانت مفيدة؟

المحلول

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

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

سيتم استدعاء هذه الوظيفة تلقائيا عند بدء تشغيل البرنامج وينتهي.

نصائح أخرى

النظر في هذا النهج،

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

ثم كلما كنت تستخدم naviagesbarimages., ، استبدالها NaviagesBarimages (), ، مثله:

يتغيرون

NSString *imageName=[navigationBarImages objectForKey:self];

ل

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

إذا كانت وظيفة الدالة المكالمات العامة يزعجك، فربما تستخدم متغير مؤقت للقبض على عودة NavigariMages ()،

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

العيب هو بمجرد استدعاء برامج التنقل ()، تم إنشاؤه مثيل NSMutabledictionary، ثم لن يحصل أبدا على فرصة للتعامل معه حتى نهاية البرنامج.

كل ما تحتاجه هو تعيين ثابتة مرة واحدة في نقطة معروفة قبل استخدامه. على سبيل المثال، يمكنك تعيين مندوب NSAPPlication وكنت تفعل العمل في -applicationDidFinishLaunching:

خيار واحد هو استخدام C ++. تغيير ملحق الملف إلى .mm واستبدال = NULL مع [[NSMutableDictionary alloc] init].

يمكنك إضافة. +initialize في ملف .m لفئتك - ستحتاج فقط إلى التأكد من أنك لا تحطم تطبيقا موجودا أو ستحصل على General Wonkiness. (من الواضح أنه يمكنك التأكد من هذا إذا كتبت التعليمات البرمجية، ولكن مع رمز الطرف الثالث، فليس هذا ليس أفضل نهج.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top