Почему автовыпуск особенно опасен/дорог для приложений для iPhone?

У меня такой вопрос, каким был бы RESTful способ раскрыть «обновленную» функциональность?

Как бы вы предоставили эту функцию на веб-сайте?

[116 ] Вы, вероятно, начнете с просмотра веб-страницы записи с помощью запроса GET, которая загрузит текущее представление страницы в ваш локальный кеш.

Когда сервер определил, что запись соответствует требованиям для обновления веб-страница будет включать в себя своего рода гипермедиа, позволяющую клиенту запускать протокол обновления. В этом случае вы, вероятно, не хотите, чтобы у этого обеспечения была безопасная семантика, поэтому это будет форма, использующая метод POST. Когда пользователь отправляет форму, браузер создает HTTP-запрос с правильными метаданными и данные формы, скопированные в тело запроса, как описано в правилах обработки HTML; запрос будет отправлен на URL-адрес, указанный в form.action сервером.

Имеет ли значение написание URL для пользователя? Не совсем, пользователь просто отправляет форму, URL - это просто непрозрачные данные. Косвенно это имеет значение из-за способа определения семантики аннулирования кэша - если мы намереваемся, что обновление должно выселить ранее кэшированные представления веб-страницы, тогда запрос на публикацию должен иметь URL-адрес самой страницы.

Аналогично, веб-форма не обязательно должна быть на странице - вы можете иметь ссылку на форму, управляемую в другом месте, используя другие правила кэширования.

Сделайте это машиночитаемым способом, и вы получите REST API.

PUT и PATCH работают одинаково, за исключением того, что тело запроса является описанием самой страницы. Загрузите HTML-код, внесите изменения, затем либо поместите новый документ целиком, либо вычислите патч-документ и отправьте его вместо этого.

PUT и PATCH действительно хорошо работают для анемичных доменов - таких как хранилища документов; труднее работать с представлениями напрямую, когда вам необходимо провести обратный инжиниринг изменений, чтобы выработать намерение.

14
задан Community 23 May 2017 в 10:32
поделиться

4 ответа

(не может принять Ваш собственный ответ?)

Ну, в конце концов, это, мне действительно удавалось найти ссылку от Разработчика Apple, добавленного как заметка на полях около конца страницы:

Примечание iPhone OS: Поскольку на iPhone OS приложение выполняется в более ограниченной памятью среде, использованию пулов автовыпуска препятствуют в методах или блоках кода (например, циклы), где приложение создает много объектов. Вместо этого необходимо явно выпустить объекты, когда это возможно.

Однако, это предлагает использовать автовыпуск тщательно, не избегая его в целом.

(и теперь для моего комментария)

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

11
ответ дан 1 December 2019 в 09:13
поделиться

Я не соглашаюсь, что избегающий автовыпуска в целом мудро.

Касание какао использует его вполне часто внутренне, и для многих ситуаций это - единственный способ выделить память правильно (хорошим примером являются допускающие повторное использование ячейки табличного представления). Если Вы понимаете то, что происходит, пул автовыпуска является большим инструментом в Вашем распоряжении. Главное помнить состоит в том, что блоки не освобождены до некоторой точки позже в цикле выполнения. Если Вы выполните жесткий цикл без взаимодействия с пользователем и накопите блоки автовыпуска, то у Вас в конечном счете закончится память.

Автовыпуск не является заменой для сборки "мусора" (не доступный на в iPhone SDK) и может привести к противным ошибкам висячего указателя (указатель все еще, кажется, хорош, затем в некоторой непредсказуемой точке идет недопустимый), но также очень полезно в письменной форме ясный и легкий поддержать код. Рассмотрите следующий случай:

[aDictionary writeToFile:
     [documentsDirectory stringByAppendingPathComponent:@"settings.plist"]
              atomically:YES];

Строка пути сгенерирована как объект автовыпуска. Мы не обязаны создавать временный объект, таким образом, мы избегаем, чтобы наверху (и возможность мы могли бы забыть выпускать его). Память будет полностью освобождена (никакие утечки), просто что это произойдет позже в цикле выполнения. Спросите себя: я собираюсь выделить сотни из них, прежде чем я возвращусь к вводу данных пользователем? Если не (как имел бы место здесь), автовыпуск является отличным решением, и действительно этот метод NSString для работы с путями является только автовыпущенной памятью доступного использования.

Я действительно соглашаюсь с вышеупомянутым плакатом, что следование конвенции и быть последовательным являются очень хорошей идеей.

5
ответ дан 1 December 2019 в 09:13
поделиться

Я склонен избегать использования автовыпуска на iPhone, где я могу (как Jon указывает, Вы не можете всегда обходиться без него), просто потому что мне нравится знать, что объекты, с которыми я работаю, выпущены момент, мне не нужны они. Ограничения памяти являются одной из самых больших проблем, с которыми Вы столкнетесь на устройстве, и я полагаю, что они - источник большинства отказывающих проблем, которые Вы найдете там.

Как выделено Apple, конкретная проблемная область - при использовании автовыпущенных объектов в любом виде цикла потому что они накопятся в пуле автовыпуска. Затем необходимо справиться, когда истощить пул или создать / выпускают тот. Выполнение, что каждая передача через цикл могла бы ухудшить производительность, но идущий слишком много передач без могли привести к опасному использованию памяти. Я все еще настраиваю это в Молекулах, потому что существуют неустойчивые проблемы памяти при импорте большой (> 2 МБ) текстовые файлы от Банка данных Белка. Я смог улучшить производительность путем уменьшения автовыпущенных объектов, но не мог устранить их полностью.

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

4
ответ дан 1 December 2019 в 09:13
поделиться

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

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

0
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: