Как заполнить константу NSArray? (код не работает в комплекте) - PullRequest
3 голосов
/ 15 мая 2011

Как заполнить константу NSArray?Или, в более общем смысле, как я могу исправить свой код ниже, чтобы иметь константу массива (созданную в Constants.h & Constants.m), которая была бы доступна другим частям моего кода.

Надеялся получить доступ кконстанта как объект статического типа (то есть в отличие от необходимости создавать экземпляр constants.m и затем обращаться к нему), это возможно.

Я отмечаю, что подход работает нормально для строки, но для NSArray проблема заключается в заполнении массива.

Код:

constants.h

@interface Constants : NSObject {
}
extern NSArray  * const ArrayTest;
@end

# import "Constants.h"

    @implementation Constants

    NSArray  * const ArrayTest = [[[NSArray alloc] initWithObjects:@"SUN", @"MON", @"TUES", @"WED", @"THUR", @"FRI", @"SAT", nil] autorelease];   
    // ERROR - Initializer element is not a compile time constant

    @end

1 Ответ

6 голосов
/ 15 мая 2011

Стандартный подход заключается в предоставлении метода класса, который создает массив при первом запросе, а затем возвращает тот же массив.Массив никогда не освобождается.

Простое примерное решение таково:

/* Interface */
+ (NSArray *)someValues;

/* Implementation */
+ (NSArray *)someValues
{
    static NSArray *sSomeValues;
    if (!sSomeValues) {
        sSomeValues = [[NSArray alloc]
                       initWithObjects:/*objects*/, (void *)nil];
    }
    return sSomeValues;
}

Вы, конечно, можете придумать это с помощью GCD вместо использования if:

/* Implementation */
+ (NSArray *)someValues
{
    static NSArray *sSomeValues;
    static dispatch_once_t sInitSomeValues;
    dispatch_once(&sInitSomeValues, ^{
        sSomeValues = [[NSArray alloc]
                       initWithObjects:/*objects*/, (void *)nil];
    });
    return sSomeValues;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...