Должен ли я избегать создания большого количества переменных? - PullRequest
0 голосов
/ 23 июня 2010

У меня есть две возможности:

1) Сохраните объект в переменной и используйте эту переменную в моем коде. Но это использует память для хранения объекта, верно?

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
BOOL bool1 = [userDefaults boolForKey: key1];
BOOL bool2 = [userDefaults boolForKey: key2];

2) Не храните его в переменной и создавайте его с нуля, когда мне это нужно.

BOOL bool1 = [[NSUserDefaults standardUserDefaults] boolForKey: key1];
BOOL bool2 = [[NSUserDefaults standardUserDefaults] boolForKey: key2];

Что было бы рекомендовано в этом случае? Если есть разница между объектами, то откуда мне знать, какой из них использовать?

Ответы [ 5 ]

3 голосов
/ 23 июня 2010

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

1 голос
/ 23 июня 2010

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

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

РЕДАКТИРОВАТЬ: Кто-то еще ответил и был принят, прежде чем я смог обновить свой ответ.Смотрите принятый ответ.

0 голосов
/ 23 июня 2010

Вы не используете больше памяти вашей программы в первом примере.Объект NSUserDefaults будет храниться в куче в любом случае, и хранилище для самой переменной будет либо a) регистром, либо b) в стеке.Регистры не занимают никакой реальной памяти вашего приложения, а память для стека уже зарезервирована.

Кроме того, указатели занимают очень небольшой объем памяти - 4 байта на 32-битных и 8 байтовна 64-битных платформах.Четверть миллиона из них займет менее 1 МБ.Отдельные скаляры, подобные этому, - последнее место, где вы должны искать экономию памяти.

0 голосов
/ 23 июня 2010

Формулировка вашего вопроса предполагает, что вы можете не полностью понимать C-указатели.Вы не «храните объект в переменной».Переменная userDefaults в вашем первом примере - это просто указатель C.Метод +standardUserDefaults возвращает указатель на объект глобальных пользовательских настроек по умолчанию, который вы присвоили userDefaults.Во втором примере вы извлекали указатель на объект дважды, один раз для каждой строки.

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

Если вам не нравятся указатели Си, обязательно прочитайте их.Это должно прояснить некоторые вещи для вас.

0 голосов
/ 23 июня 2010

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

Я чувствую, что у тебя есть выбор

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

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

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