Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top