Авто-релиз iPhone - PullRequest
       28

Авто-релиз iPhone

2 голосов
/ 09 января 2009

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

Как новичок в Какао, я помню, как сначала читал руководящий документ, в котором настоятельно предлагалось избегать автоматического выпуска в пользу ручного сохранения / выпуска для iPhone. Тем не менее, на старте появился более «старший» разработчик Cocoa (которого с иронией отпустили с тех пор), который использовал повсеместное использование автоматического выпуска. По общему признанию, меня перевели в режим «monkey see monkey do», и, похоже, он снова преследует меня (теперь я единственный разработчик в проекте).

Так что же делать дальше? Мне кажется, что я должен разветвлять код и пытаться пройти и заменить, где это возможно, код автозапуска, держа мои пальцы скрещенными, чтобы я случайно не сломал приложение. Кажется, что многие библиотечные вызовы приводят к автоматически выпущенным объектам, таким как stringWithFormat и почти всем, где я сам не использую alloc. Любые другие ошибки и / или предложения, которые я должен высматривать? Спасибо Какао гуру.

Ответы [ 6 ]

12 голосов
/ 09 января 2009

Использование релиза вместо автоматического выпуска может улучшить использование памяти в труднодоступных местах (что хорошо для iPhone), но это совсем не поможет при сбое, если вы не следуете правилам сохранения / выпуска. Я прочитал бы несколько руководств по управлению памятью в Obj-C, если вы все еще немного не уверены в том, что вам следует делать, а затем приступил бы к этим сбоям, используя отладчик и отчеты о сбоях, чтобы выяснить, где вы перестали выпускать объекты , Это и , это - это два хороших начала.

4 голосов
/ 10 января 2009

Более важным, чем выбор автоматического выпуска или ручного выпуска, является то, как часто вы alloc и dealloc ваши NSAutoreleasePool с. Поскольку большинство фреймворков Cocoa широко используют autorelease, вам необходимо иметь правильную стратегию слива пула. Как только это произойдет, выбор: release или autorelease станет гораздо менее важным.

Тем не менее, единственные области, о которых вам следует беспокоиться - это узкие циклы - выделите и отпустите NSAutoreleasePool каждые несколько итераций для достижения наилучших результатов; и когда вы породили еще один NSThread, у которого нет Runloop - создайте пул и сливайте его время от времени, бездействуя. Поскольку большинство приложений выделяют только небольшое количество данных на событие, стратегия UIKit по распределению пула до отправки события и его освобождению после возврата отправки работает очень хорошо.

2 голосов
/ 20 ноября 2010

Если вы думаете, что не знаете, как использовать авто-релиз, посмотрите CS193p FALL 2010 на iTunes U -> Лекция № 4.

Он научит вас все об управлении памятью и прочее (если вы пропустите первые 10 минут или около того)

0 голосов
/ 08 ноября 2012

Когда вы выполняете автоматический выпуск, вы, в основном, говорите: «Мне это больше не нужно, но кто-то другой может его забрать (до того, как пул автоматического выпуска будет слит)». Когда вы явно ссылаетесь на объект, вы говорите: «Мне это больше не нужно, и если кто-то еще не сказал иначе (приобрел), он должен быть немедленно освобожден».

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

0 голосов
/ 27 января 2010

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

0 голосов
/ 09 января 2009

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

...