объявление глобальных переменных в проекте iPhone - PullRequest
14 голосов
/ 08 августа 2009

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

Ответы [ 6 ]

26 голосов
/ 08 августа 2009

Есть несколько способов сделать это:

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

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

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

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

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

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

8 голосов
/ 08 августа 2009

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

[[[UIApplication sharedApplication] delegate] myArray];

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

2 голосов
/ 09 августа 2009

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

Однако, вероятно, лучше использовать одноэлементный объектный подход с аксессором класса, таким как NSUserDefaults, а затем предоставить методы доступа к экземпляру для получения ваших данных. Таким образом, вы будете изолированы от возможных изменений структуры данных в будущем. Затем вы использовали бы статическую переменную, как указано выше, но в файле .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], к которым можно получить доступ из любой части приложения и без каких-либо ошибок во время компиляции.

1 голос
/ 08 февраля 2011

В отношении ответа Дейва здесь:

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

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

1 голос
/ 04 марта 2010

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

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

В файле 1:

NSArray *MyArray;

В файле 2:

extern NSArray *MyArray;

Играет капитан Очевидное здесь.

0 голосов
/ 01 мая 2014

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

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

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