Объявление глобальных переменных в проекте iPhone

как я могу объявить глобальный NSArray, а затем использовать его в своем приложении?

Ответы

Ответ 1

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

  • Вместо того, чтобы объявлять его как глобальную переменную, оберните его в одноэлементный объект, а затем оставьте синглтон доступным в любом месте (путем #importing.h файла)

  • Создайте файл .h, например "Globals.h". В .h объявите массив как extern NSMutableArray * myGlobalArray; Затем в другом месте вашего приложения (AppDelegate - это хорошее место) просто выполните: myGlobalArray = [[NSMutableArray alloc] init]; Затем в любом месте вам понадобится массив, просто #import "Globals.h"

  • Это похоже на # 2, но без глобального заголовка. Вы можете определить свой массив как extern NSMutableArray *myGlobalArray; внутри блока #ifdef __OBJC__ вашего проекта .pch файла. Файл .pch является файлом заголовка, который автоматически помещается в каждый файл в вашем проекте.

Есть плюсы и минусы каждого подхода. Я использовал все три в разное время в разных обстоятельствах. Я бы сказал, что одноэлементный подход, вероятно, самый правильный, поскольку он был бы наиболее гибким для инициализации, ограничения доступа и управления памятью. Однако это может быть ненужным, если вам это не нужно.

Вариант № 2 хорош, если у вас много "глобальных" переменных, которые вы не хотите раскрывать для каждого файла в вашем проекте. Вы можете просто #import его там, где это необходимо. Однако этот подход (а также № 3) дезактивирует декларацию от инициализации (т.е. Объект не создается вблизи того, где он был объявлен). Некоторые могут утверждать, что это неправильно, и они могут быть правильными.

Вариант № 3 хорош, потому что вам никогда не приходилось вспоминать что-либо вообще. Тем не менее, он поднимает те же вопросы, что и вариант № 2.

Ответ 2

4-й ответ - объявить массив в UIApplicationDelegate и получить доступ к нему через

[[[UIApplication sharedApplication] delegate] myArray];

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

Ответ 3

Если вы планируете хранить какие-то общие настройки для своего приложения, используйте [NSUserDefaults sharedDefaults], чтобы сохранить простые данные, которые можно использовать в приложении. Если вы сохраняете временные данные, то статический подход будет работать как в другом месте.

Однако, вероятно, лучше использовать одноэлементный подход к объекту с помощью класса accessor, например NSUserDefaults, а затем предоставить методы доступа к экземплярам для получения ваших данных. Таким образом, вы изолируете себя от потенциальных изменений структуры данных в будущем. Затем вы должны использовать статический var, как указано выше, но внутри файла .m(и, следовательно, вам не нужно определение "extern" ). Это обычно выглядит следующим образом:

static Foo *myDefault = nil;
@implementation Foo
+(Foo)defaultFoo {
  if(!myDefault)
    myDefault = [[Foo alloc] init]; // effective memory leak
  return myDefault;
}
@end

Затем у вас будут экземпляры экземпляров и используйте их как [[Foo defaultFoo] myArray], к которым можно получить доступ из любой части приложения, и без каких-либо ошибок времени компиляции.

Ответ 4

Кажется, что у всех здесь есть неявная, опущенная первая строка: "Вы можете сделать это K & R C-style или..."

Да, вы все еще можете сделать это C-style.

В файле 1:

NSArray *MyArray;

В файле 2:

extern NSArray *MyArray;

Играющий капитан Очевидный здесь.

Ответ 5

В ответ на ответ Дейва:

Это похоже на # 2, но без глобального заголовка. Вы можете определить свой массив как статический extern NSMutableArray * myGlobalArray; внутри блока #ifdef OBJC вашего проекта .pch файла. Файл .pch является файлом заголовка, который автоматически помещается в каждый файл в вашем проекте.

typedef - класс хранения, а static - класс хранения, и вы можете определять объекты только в одном классе хранения. Вывод "статического" позволит компиляции приложения с вашим ответом выше.

Ответ 6

Существует несколько возможностей. Самые популярные:

1 Используйте одноэлементный объект - http://www.galloway.me.uk/tutorials/singleton-classes/

2 Объявите его в делегате приложения:

@interface Your_App_Delegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) NSArray *array;
   . . .

и получить к нему доступ:

((Your_App_Delegate*)[[UIApplication sharedApplication] delegate]).array;

3 Используйте NSUserDefault