iPhone, мне нужно повторно использовать NSArray, который имеет постоянные значения в разных представлениях, как? - PullRequest
1 голос
/ 14 октября 2010

У меня есть следующий массив.

    NSArray *arrayDisplay = [[NSArray alloc] initWithObjects:@"Daily", 
        @"Weekly", @"Monthly", nil];

Мне нужно использовать его в двух представлениях, я обеспокоен тем, что могу внести изменения и забыть изменить другое в будущем. Поэтому я хотел бы объявить это один раз и использовать его снова.

Как мне это сделать?

Ответы [ 6 ]

2 голосов
/ 14 октября 2010

Попробуйте написать метод класса или даже функцию C, которая лениво создает массив. Например, вот метод класса, который делает то, что вы хотите:

+ (NSArray *)frequencyChoices
{
    static NSArray *choices;

    if (choices == nil)
    {
        choices = [[NSArray alloc] initWithObjects:
                   @"Daily", @"Weekly", @"Monthly", nil]; 
    }

    return choices;
}

Написание той же функциональности, что и функция C, делает ее еще более общей:

NSArray *frequencyChoices(void)
{
    static NSArray *choices;

    if (choices == nil)
    {
        choices = [[NSArray alloc] initWithObjects:
                   @"Daily", @"Weekly", @"Monthly", nil]; 
    }

    return choices;
}

Преимущество метода класса заключается в том, что вы можете переопределить его в подклассе, если это когда-нибудь пригодится.

2 голосов
/ 14 октября 2010

Вы можете сохранить его как свойство в общем объекте, таком как делегат приложения.

Предполагая его неатомарное, сохраните свойство type, затем получите к нему доступ:планируйте его изменение, вам может потребоваться NSMutableArray.

1 голос
/ 14 октября 2010

Вместо использования подхода Singleton рассмотрите возможность определения, какой объект в иерархии объектов вашего приложения должен владеть этим массивом, а затем передайте эту ссылку туда, где это необходимо (см. внедрение зависимостей ).

1 голос
/ 14 октября 2010

Если ваше приложение простое, рассмотрите модель Singleton, в которой данные, к которым вы обращаетесь, доступны через глобальный экземпляр singleton. текст ссылки

0 голосов
/ 14 октября 2010

Если вы не возражаете против глобальных переменных, вы можете создавать их экземпляры во время загрузки:

@interface FooClass : ... {
  ...
}

static NSArray * FooClass_timescale;

@end


@implementation FooClass

+(void)load {
  FooClass_timescale = [[NSArray alloc] initWithObjects:@"Daily", @"Weekly", @"Monthly", nil]; 
}

@end

Я предпочитаю делать это, когда есть куча вещей, которые я хочу создать (например, цвета для темы / кожи / бренда / чего угодно), поскольку это короче, чем написание функции для их возврата. Конечно, можно случайно изменить глобальную переменную, но мне это никогда не удавалось (обычно я просто забываю сохранить).

0 голосов
/ 14 октября 2010

Вы можете сохранить массив как plist в вашем проекте и загрузить его в каждом месте, где это необходимо, с помощью

NSArray *arrayDisplay = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myArrayName" ofType:@"plist"]];

Это будет работать до тех пор, пока вам не нужно менять значения в обоих местах, пока программа фактически выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...