UIView ivar против пометки местного UIView var - PullRequest
4 голосов
/ 27 сентября 2010

Сценарий 1: Для UIViewController лучше (1) создать ивар для UIView, к которому я снова получаю доступ в 1 или 2 функциях за пределами loadView?Или (2) я должен просто пометить его в loadView и затем использовать - (UIView *)viewWithTag:(NSInteger)tag, чтобы снова получить к нему доступ в других функциях?Я предполагаю, что вариант 1 увеличивает память на размер указателя, поэтому 32/64-битные, и создает методы доступа (при условии, что я объявляю @property & @synthesize), а затем требует освобождения ivar в dealloc и установив его на nil в viewDidUnload ... и этот вариант 2 экономит память, имеет меньше установочного кода, но стоит немного времени обработки и немного дополнительного кода, чтобы найти представление по его тегу.Прав ли я во всем этом?

В этом сценарии лучше использовать ivar, но я не уверен.

Сценарий 2: Как насчет пользовательского подкласса UIView, которыйимеет 5 подвидов?Имея в виду, что у меня будет около 30 экземпляров этого пользовательского подкласса в памяти в данный момент времени (они будут подпредставлениями tableViewCell с.), Если я буду использовать 5 иваров для подпредставлений или я должен пометить их всех?

В этом сценарии я думаю, что память, сэкономленная путем пометки их всех, будет стоить небольшого снижения производительности при их поиске с - (UIView *)viewWithTag:(NSInteger)tag.

Мысли?

Спасибо!

Мэтт

Ответы [ 3 ]

5 голосов
/ 27 сентября 2010

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

При написании кода я всегда стараюсь думать о человеке, который собирается читатькод через год или два года.Этим человеком может быть я или кто-то другой, но в любом случае, я знаю, что этот человек оценит читаемый код.Они с меньшей вероятностью будут благодарить меня за сохранение 1 КБ памяти на устройстве с ОЗУ не менее 128 МБ.

5 голосов
/ 27 сентября 2010

Подумайте на мгновение, что каждое представление поддерживается CALayer. IIRC, представления имеют размер около 44 байтов (плюс foo), уровни имеют размер около 44 байтов (3 раза, поскольку существует дерево представления и дерево визуализации), а слои, которые выполняют любой рендеринг, поддерживаются растровыми контекстами.

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

Я использую теги только там, где они облегчают мою жизнь:

  • Множество похожих видов в кончике (куча кнопок, каждый из которых выбирает свой цвет). Я мог бы связать несколько точек, но тогда код должен был бы иметь дело с кучей иваров, а не с арифметикой).
  • Множество подпредставлений со схожей функциональностью (например, «страницы» в представлении с прокруткой или в виде ячейки в контейнере, похожем на UITableView). Я мог бы отслеживать их в массиве, но сегодня мне лень.
  • Всякий раз, когда мне нужно представление для хранения дополнительного целого числа (например, номер страницы). Существует множество других способов (создание подклассов, «связанных объектов», добавление значений в layer.style ...). Как правило, это относится к первым двум местам.

Также помните, что [v viewWithTag:tag] может возвращать v, любое подпредставление, любое подпредставление подпредставления ... Рассмотрим класс FooView, который имеет «представление контента» с тегом 1 и «представление панели инструментов» с тег 2:

FooView * f1 = ...;
FooView * f2 = ...;
[f1.contentView addSubview:f2];
NSLog(@"%@ %@", f1.toolbarView, f2.toolbarView);

Что это печатает? Ну, они оба могут быть панелью инструментов f2!

Да, Apple могла бы сделать поиск более осмысленным (она могла бы продолжать поиск до тех пор, пока не обнаружит наименее глубокое совпадение или не использовала поиск с глубиной итеративного углубления вначале), но я предполагаю, что она выполняла простой поиск в глубину если в документации не указано иное.

4 голосов
/ 27 сентября 2010

Я думаю, что вы задаете неправильный вопрос.

Мне кажется, что либо память, необходимая для хранения 5 указателей, либо время, необходимое для просмотра 5 представлений с помощью viewWithTag:, будетничтожно мал в общей схеме вещей.

Выберите любое решение, которое вы найдете, чтобы ваш код легче писать, понимать и поддерживать.

В маловероятном случае, когда фактическое профилирование использования времени / памяти указываетчто выбранное вами решение является проблемой, рассмотрите другой вариант.Все остальное - преждевременная оптимизация.

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