Автовыпуск iPhone

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
9 884
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Ссылки "This" мертвы.

andytuba 21.05.2014 04:30

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

У меня нет ссылки. Это было предложено в одном из их Tech Talks. По сути, когда вы автоматически выпускаете объект, он зависает в течение произвольного периода времени, пока система не сможет его уничтожить. Это означает, что, хотя он может «исчезнуть», он все еще использует ресурсы - что-то очень ценное на iPhone. Явно освобождая объекты, вы немедленно получаете эти ресурсы обратно.

August 15.05.2010 20:18

Посмотрите в следующем документе Рекомендации по использованию памяти и производительности Найдите "Освободить неиспользуемую память"

Jay Haase 21.11.2010 10:44

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

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

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

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

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

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

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

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