2012-02-19 2 views
0

Я изучаю Objective-C и совсем недавно начал использовать классы (вместо того, чтобы иметь все в ViewController). Я сталкиваюсь с проблемой в том, что я не знаю, что делать с переменными, которые я хочу быть доступными в других классах.Objective C, Classes & Global Variables

У меня есть NSArray UIView, созданный в моем «ViewController». Затем он передается моему «LayoutManager», который устанавливает их фрейм на основе размера экрана. Этот массив также должен быть доступен из моих «BlockManager» и «ColorManager».

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

ответ

2

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

В вашем случае это звучит так: LayoutManager - это задача с одним выстрелом (или, возможно, один раз за поворот?), Поэтому было бы прекрасно говорить о том, что взаимодействие объекта как «вот мои взгляды, пожалуйста, размер их» и сделать что весь жизненный цикл объекта. Таким образом, вы передадите массив в init, вы позволите классу работать один раз, после чего вы его отпустите.

Если BlockManager и ColorManager имеют что-то, что им необходимо для связи с контроллером вашего представления относительно его представлений, возможно, вы должны создать подходящие протоколы делегатов. Затем линия связи заключается в том, что они позволяют контроллеру представления знать, что он подсчитал, он должен знать, и он отвечает за принятие мер по массиву.

+0

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

2

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

Я недавно переработан всю свою программу из одноэлементных пропусканием объектов по мере их необходимости. Обратите внимание, что однопользовательские и общие глобальные объекты не идентичны, а собственные классы Apple используют sharedObject или defaultObject, который создает экземпляр и возвращает общий экземпляр, но ничто не мешает вам создать другой экземпляр класса для ваших собственных нужд.

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

// Up the top in the .m file 
static MySharedClass *sharedInstance; 

// A class method to return the shared instance 
+ (MySharedClass *)sharedInstance { 
    if (!sharedInstance) { 
     sharedInstance = [[MySharedClass alloc] init]; 
    } 
    return sharedInstance; 
} 

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

Я бы создал свой главный контроллер (ViewController), который затем создаст экземпляр других классов контроллеров и передаст ресурсы между ними. Этот NSArray из UIViews, который вы упомянули, будет храниться как можно больше в цепочке, по мере необходимости, по-видимому, вверху. Затем этот презентатор создавал LayoutManager и передавал ему необходимые объекты для дальнейшей работы. И таким же образом я передал бы эти объекты в BlockManager и ColorManager.