Объявление глобальных переменных в проекте 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