Есть ли что-нибудь, что облегчает управление памятью для программирования приложений iPhone / iPod Touch? - PullRequest
3 голосов
/ 22 июня 2009

Я использовал Java и Ruby только так долго, что мне не нравится снова отслеживать свою память. Дело не в том, что я не могу это сделать, я могу. Я просто не хочу.

Любые специальные приемы, библиотеки или что-то еще, что вы узнали о работе с памятью в iApps, положите на меня здесь.

Ответы [ 8 ]

5 голосов
/ 22 июня 2009

Это действительно очень, очень легко. Перестаньте беспокоиться о сохранении счета и, ради бога, никогда не вызывайте метод "retainCount" для объекта. Это бесполезно.

Если вы вызываете метод с «alloc», «new» или «copy» в любом месте его имени или вызываете метод «retain», вы владеете этим объектом. Вы несете ответственность за отказ от этой собственности, когда закончите с ней.

Для этого вызовите «release», если вам все еще не нужно возвращать ссылку на объект, или «autorelease», если вы это сделаете.

Документация по теме однозначна. Это не сложно.

3 голосов
/ 22 июня 2009

Я очень рекомендую получить Начало разработки для iPhone: изучение iPhone SDK .

Еще одна ключевая вещь, на которую стоит обратить внимание - это установка Clang Static Analyzer . Он анализирует ваш код и может обнаружить много общих утечек памяти, а также потенциальных проблем с логикой. Apple внесла большой вклад в этот анализатор и будет стремиться интегрировать его в будущие выпуски X-Code;)

2 голосов
/ 22 июня 2009

Это не так уж сложно. Вот несколько практических правил, которые будут идти долго.

  • Отпустить все свойства в dealloc (если они не установлены на «назначить»).
  • Если вы «выделяете» «новый» или «Копировать» в вашей инициализации, вы наверное надо "отпустить" в dealloc.
  • Если вы «выделяете» «новый» или «Копировать» в начале метода, вам, вероятно, нужно «отпустить» на конец метода.
  • Если вы "выделяете" «новый» или «скопировать» что-то, чтобы положить в массив, словарь или словарь вперед и отпустите ... Коллекция сохранит его без каких-либо помощь от тебя. (Я не большой поклонник авто-релиз, но это довольно достойная ситуация для его использования. Создайте объект автоматически освобожден, затем добавьте его в коллекцию. Готово.)

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

В остальном время часто запускайте код с помощью инструмента Leaks. Исправьте проблемы, КАК ВЫ НАЙДЕТЕ ИХ. Сейчас исправить это гораздо проще, чем за месяц, когда вы не помните, почему написали код именно так.

И, наконец ... это редко, но код Apple иногда протекает. Инструмент утечки должен точно сказать, что происходит утечка. Если это не похоже на то, что вы делаете, ВОЗМОЖНО, что это не так. В качестве конкретного примера: Core Data для iPhone теряет небольшие объемы ОЗУ при (я думаю) создании нового ManagedObjectContext. Может быть, когда ты делаешь уловку, я не могу вспомнить сразу же на макушке.

2 голосов
/ 22 июня 2009

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

И обязательно запустите его на устройстве, а не на симуляторе. Они по-разному обрабатывают некоторые ситуации с памятью.

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

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

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

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

0 голосов
/ 22 июня 2009

Это может быть неловко с Java или Python (я так делал), но как только вы к этому привыкнете, это просто естественно. Вы владеете объектами, созданными с помощью alloc или copy, и должны освобождать их, а все остальное - нет. Большую часть времени вы будете создавать автоматически выпущенные объекты (коллекции, строки).

0 голосов
/ 22 июня 2009

У них только что было шоу Dot Net Rocks на этом

http://www.dotnetrocks.com/default.aspx?showNum=454

Они упоминают как монопроект, так и тот факт, что Objective C 2.0 будет иметь лучшие возможности управления памятью. Кроме этого, это отстой.

Редактировать: исправлены опечатки

0 голосов
/ 22 июня 2009

Я этого не делал, но я знаю, что Mono был перенесен на iPhone, что означает, что вы можете писать приложения для iPhone в .Net (C #, VB.Net и т. Д.), И вам не нужно беспокоиться о памяти управление.

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