Подходит к концу разработки приложения для iPhone, и мне интересно, насколько плохо использовать автозапуск при разработке для iPhone. Я столкнулся с некоторыми довольно случайными сбоями, и пока я не могу указать на что-либо, кроме неаккуратного использования памяти.
Как новичок в Cocoa, я помню, как изначально читал руководящий документ, в котором настоятельно рекомендовалось избегать автоматического выпуска в пользу сохранения / выпуска вручную для iPhone. Тем не менее, более «старший» разработчик Cocoa рано вступил в игру (которого, по иронии судьбы, с тех пор уволили), который повсюду использовал автозапуск. По общему признанию, я был переведен в режим «обезьяна видит обезьяну», и, похоже, он возвращается, чтобы преследовать меня (теперь я единственный разработчик в проекте).
Так что же делать дальше? Мне кажется, что я должен разветвлять код и пытаться пройти и заменить, где это возможно, код автозапуска, скрестив пальцы, чтобы я случайно не сломал приложение. Кажется, что многие вызовы библиотеки приводят к автоматически выпускаемым объектам, таким как stringWithFormat, и почти ко всему, где я сам не использую alloc. Есть ли другие ошибки и / или предложения, на которые я должен обратить внимание? Спасибо гуру какао.





Использование выпуска вместо автоматического выпуска может улучшить использование памяти в труднодоступных местах (что хорошо для iPhone), но это не поможет при сбоях, если вы не соблюдаете правила сохранения / выпуска. Я бы прочитал несколько руководств по управлению памятью в Obj-C, если вы все еще немного не уверены в том, что вы должны делать, а затем после этих сбоев, используя отладчик и отчеты о сбоях, чтобы узнать, где вы перестаете освобождать объекты. . Этот и это - два хороших места для начала.
По соображениям производительности iPhone Apple рекомендует по возможности не использовать автоматически выпущенные объекты. Вместо этого явно освободите свои объекты, когда закончите с ними.
У меня нет ссылки. Это было предложено в одном из их Tech Talks. По сути, когда вы автоматически выпускаете объект, он зависает в течение произвольного периода времени, пока система не сможет его уничтожить. Это означает, что, хотя он может «исчезнуть», он все еще использует ресурсы - что-то очень ценное на iPhone. Явно освобождая объекты, вы немедленно получаете эти ресурсы обратно.
Посмотрите в следующем документе Рекомендации по использованию памяти и производительности Найдите "Освободить неиспользуемую память"
Более важным, чем выбор автоматического или ручного выпуска, является то, как часто вы переключаете alloc и dealloc на свои NSAutoreleasePool. Поскольку большинство фреймворков Какао широко используют autorelease, вам необходимо иметь правильную стратегию осушения пула. Как только это будет сделано, выбор между release или autorelease станет гораздо меньшей проблемой.
При этом единственные области, о которых вам следует беспокоиться, - это узкие циклы - выделяйте и выпускайте NSAutoreleasePool каждые несколько итераций для достижения наилучших результатов; и когда вы создали еще один NSThread, у которого нет Runloop - создайте пул и слейте его, время от времени он становится бездействующим. Поскольку большинство приложений выделяют только небольшой объем данных для каждого события, стратегия UIKit по распределению пула перед отправкой события и его освобождению после возврата из диспетчеризации работает очень хорошо.
Использование пулов с автоматическим выпуском означает, что вы можете оставить неиспользуемую память. Поскольку у iPhone меньше памяти для работы, вы можете улучшить производительность, если освободите ненужную память как можно скорее, вместо того, чтобы позволять ему бездельничать, занимая ресурсы, пока он ждет автозапуска.
Если вы думаете, что не знаете, как использовать автозапуск, посмотрите CS193p FALL 2010 на iTunes U -> Лекция номер 4.
Он учит вас всему об управлении памятью и прочем (если вы пропустите первые 10 минут или около того)
Когда вы автоматически выпускаете, вы в основном говорите: «Мне это больше не нужно, но любой другой может забрать его (до того, как пул автоматического выпуска будет опорожнен)». Когда вы явно освобождаете объект, вы говорите: «Мне это больше не нужно, и если кто-то еще не сказал иное (приобретено), его следует немедленно освободить».
Следовательно, автозапуск обычно не является неправильным. Это требуется, когда вы хотите передать объекты обратно отправителю сообщения, не требуя, чтобы отправитель позаботился об освобождении объекта.
Ссылки "This" мертвы.