Цель C, классы и глобальные переменные - PullRequest
0 голосов
/ 20 февраля 2012

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

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

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

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

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

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

Синглтон, с другой стороны, ограничивает объект одним экземпляром, и это означает отказ от возможности иметь два экземпляра (которые могут потребоваться в будущем) для получения полного доступа из любого места.В этом смысле вам действительно нужна только общая часть доступа, а не ограничение одного экземпляра, поэтому вы можете рассмотреть шаблон 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 of UIViews будет храниться в цепочке настолько высоко, насколько это необходимо, предположительно, в самом верху.Затем этот Presenter создаст LayoutManager и передаст ему необходимые объекты для дальнейшей работы.И таким же образом я бы передавал эти объекты в BlockManager и ColorManager.

2 голосов
/ 20 февраля 2012

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

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

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

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