Как сделать глобальный массив? - PullRequest
5 голосов
/ 20 марта 2010

Итак, я прочитал этот пост , и это в значительной степени именно то, что я искал. Однако ... это не работает. Я предполагаю, что я не собираюсь идти с одноэлементным объектом, а сделаю массив в файле Global.h или вставлю его в файл _Prefix.

Оба раза, хотя я делаю это, я получаю ошибку:

Ожидаемый список спецификаторов-спецификаторов перед «static»

и это не работает. Так что ... я не уверен, как заставить это работать, я могу удалить extern, и это работает, но я чувствую, что мне нужно это, чтобы сделать это константой.

Конечная цель - сделать этот изменяемый массив доступным из любого объекта или любого файла в моем проекте. Помощь будет оценена!

Это код моего файла Globals.h:

#import <Foundation/Foundation.h>

static extern NSMutableArray * myGlobalArray;

Не думаю, что мне нужно что-то в файле реализации. Если бы я поместил это в файл префикса, ошибка была бы такой же.

EDIT

Итак, я удалил файл .m из Globals, и у меня просто есть код в Globals.h. Предполагая, что я собираюсь продолжить эту ужасную практику наличия глобальных переменных (я знаю, что это плохо, я просто хочу проверить это), у меня теперь есть новая ошибка. Там написано:

"Несколько классов хранения в спецификаторах объявлений"

Если я удаляю «extern», он работает, а если я удаляю «static», он работает, но наличие обоих не… что теперь?

**** Double Edit ****

Хорошо, поэтому я попытался добавить массив в мой делегат UIApplication, но я делаю это неправильно, потому что он не работает. Может ли кто-нибудь дать мне пример кода относительно того, где разместить его доступ к нему? Я не знаю, должен ли он идти в реализации или где-то еще, и как только массив инициализируется, как получить к нему доступ из других файлов ... Я устанавливаю новую переменную для массива или что-то еще?

Ответы [ 6 ]

3 голосов
/ 20 марта 2010

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

[[UIApplication sharedApplication] myArray];
3 голосов
/ 20 марта 2010

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

Вместо этого создайте объект с массивом внутри него и сделайте этот объект одноэлементным (или, что еще лучше, создайте для него фабрику).

Когда бы вы ни захотели изменить свой массив, для этого вызовите методы объекта. Если вы сделаете это, я уверен, что вы найдете много избыточного кода, который вы можете включить в этот объект (например, поиск в массиве значения - вместо этого создайте метод «search» в объекте и передайте значение).

Может показаться, что вам не нужно выполнять большую работу, но вы обнаружите, что это довольно забавная работа, и вы должны обнаружить, что вам НЕОБХОДИМО это сделать, когда увидите, сколько кода принадлежит этому объекту ...

2 голосов
/ 20 марта 2010

Два (основных) способа сделать массив глобальным - это отдельный класс - либо у вас есть класс с методом

static NSMutableArray *foo;
+(NSMutableArray *)foo {
    return foo;
}

(в файле .m) со статическим фрагментом НЕ в заголовочном файле, или просто

static extern NSMutableArray * myGlobalArray;

без оболочки-одиночки (что, мне кажется, лучше, так как избавляет вас от лишнего кода)

В любом случае, это все еще плохая практика, которую я бы старался избегать.

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

Это то, что я искал:

http://derekneely.com/tag/app-delegate/

Спасибо, что указали мне в правильном направлении!

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

В общем, наличие файла "Globals.h" - это неприятный запах, так как на работе есть антипаттерн.

Я бы даже советовался против совета Билла К. и вообще не использовал бы шаблон Синглтона.

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

0 голосов
/ 20 марта 2010
#import <Foundation/Foundation.h>

static extern NSMutableArray * myGlobalArray;

@interface Globals : NSObject {
}


@end
...