Понедельник, а мы опять про утечки памяти?!
Именно так! Отладка — важная часть в нашей с вами работе, так что материалы про неё вряд ли будут лишними.
Пару раз я делился материалами про retain cycles: тут, тут и вот здесь, например.
🛠 Решил вынести один из способов в статью здесь. Конечно, для многих он очевиден, и может возникнуть вопрос, зачем — это же и так понятно! Но кто-то может найти этот способ вполне рабочим.
Именно так! Отладка — важная часть в нашей с вами работе, так что материалы про неё вряд ли будут лишними.
Пару раз я делился материалами про retain cycles: тут, тут и вот здесь, например.
🛠 Решил вынести один из способов в статью здесь. Конечно, для многих он очевиден, и может возникнуть вопрос, зачем — это же и так понятно! Но кто-то может найти этот способ вполне рабочим.
Разработчица поделилась своим опытом работы в Expedia
Ким рассказала в целом о своих впечатлениях, я же постарался вынести суть первой части — собеседования.
— Процесс собеседования был исключительно освежающим по сравнению с другими собеседованиями.
— Во время первого телефонного собеседования у Ким случился приступ паники, что привело к сильному затуманиванию мышления.
Скорее всего, больший опыт собеседований поможет справляться с этим лучше, но все ситуации довольно уникальны.
— Спросили об unwrapping optionals. Из-за пункта выше Ким немного поплыла, но интервьюер помог найти ответ. И это позволило рассказать о том, что можно было использовать для очистки вложенных операторов if в коде. Ким привела пример из своей работы.
Тут же Ким привела ремарку, что на других собеседованиях её бы просто сразу списали со счетов и собеседование могло окончиться.
— Последним этапом было очное собеседование, длившееся полдня, на котором Ким познакомили с командой, менеджером, затем был раунд вайтбординга. Далее сессия лайвкодинга и командный обед.
Про командный обед необычно, конечно.
Этот раунд был долгим, но оно преподало мощный урок о проведении собеседований, который Ким применяет с тех пор на всех должностях.
— Ни на одном этапе Ким не оставляли одну. Тот, кто проводил собес, помогал решать проблему. Если Ким застревала в рассуждениях, она могла задать вопросы и получить какие-то разъяснения.
Если можно было спросить о каких-то мыслях, которые могли помочь, это стоило делать.
— Ожидания были понятны на каждой итерации собеседования. Собеседование — занятие, где участвует два человека, для работы в паре. Важные слова: интервьюеру важно, как вы можете работать с ним в команде, а не только самостоятельно.
— Решение задач было важным пунктом. Но его нужно было пройти в том числе и для того, чтобы понять, что представляет из себя окружение в целом.
Ким рассказала в целом о своих впечатлениях, я же постарался вынести суть первой части — собеседования.
— Процесс собеседования был исключительно освежающим по сравнению с другими собеседованиями.
— Во время первого телефонного собеседования у Ким случился приступ паники, что привело к сильному затуманиванию мышления.
Скорее всего, больший опыт собеседований поможет справляться с этим лучше, но все ситуации довольно уникальны.
— Спросили об unwrapping optionals. Из-за пункта выше Ким немного поплыла, но интервьюер помог найти ответ. И это позволило рассказать о том, что можно было использовать для очистки вложенных операторов if в коде. Ким привела пример из своей работы.
Тут же Ким привела ремарку, что на других собеседованиях её бы просто сразу списали со счетов и собеседование могло окончиться.
— Последним этапом было очное собеседование, длившееся полдня, на котором Ким познакомили с командой, менеджером, затем был раунд вайтбординга. Далее сессия лайвкодинга и командный обед.
Про командный обед необычно, конечно.
Этот раунд был долгим, но оно преподало мощный урок о проведении собеседований, который Ким применяет с тех пор на всех должностях.
— Ни на одном этапе Ким не оставляли одну. Тот, кто проводил собес, помогал решать проблему. Если Ким застревала в рассуждениях, она могла задать вопросы и получить какие-то разъяснения.
Если можно было спросить о каких-то мыслях, которые могли помочь, это стоило делать.
— Ожидания были понятны на каждой итерации собеседования. Собеседование — занятие, где участвует два человека, для работы в паре. Важные слова: интервьюеру важно, как вы можете работать с ним в команде, а не только самостоятельно.
— Решение задач было важным пунктом. Но его нужно было пройти в том числе и для того, чтобы понять, что представляет из себя окружение в целом.
iOS Dev
Внимание, вопрос!
Каким будет результат выполнения кода, скриншот которого вы видите?
Anonymous Quiz
7%
""
33%
"String"
27%
Swift.String
7%
nil
3%
Ничего из вышеперечисленного
15%
Код не скомпилируется
7%
Код скомпилируется, но будет ошибка в рантайме
🤔Неужели нам вернут стену?!
Правда, в Telegram.
🧑💻 В репозитории клиента, который является открытым, можно было заметить ряд изменений, которые подтверждают появление новостной ленты в Telegram.
Вероятнее всего, в одном из следующих апдейтов пользователям будет доступна возможность видеть посты из каналов, идущие подряд.
@iOS Dev
Правда, в Telegram.
🧑💻 В репозитории клиента, который является открытым, можно было заметить ряд изменений, которые подтверждают появление новостной ленты в Telegram.
Вероятнее всего, в одном из следующих апдейтов пользователям будет доступна возможность видеть посты из каналов, идущие подряд.
@iOS Dev
Подводные камни сторонних зависимостей и библиотек
1. Сложность
Управление версиями, волновой эффект обновлений зависимостей, время сборок. Сторонний код сулит поддержку проблем, которые там могут возникнуть.
2. Объём кода
Это может показаться очевидным, но каждая строка кода очень важно. В одиночку каждая добавленная строка не имеет большого значения. В какой-то момент у вас появится пляж, на котором будет лежать разный мусор (технические долги, ошибки и т.д.). Наша задача как разработчиков — чистить и поддерживать этот пляж.
3. Безопасность
Тут всё понятно. Помните, если пользователь даст доступ к гео, например — в любое время, то и любая зависимость в коде может получить доступ к этому гео.
4. Разбитые окна
Идея "разбитых окон" в программном обеспечении заключается в том, что новички на проекте с большей вероятностью будут следовать установленным условностям и привычкам в кодовой базе. Если в проекте много зависимостей, то это приводит к тому, что добавляется еще больше зависимостей, не обдумывая, нужна ли эта зависимость на самом деле. Это может быстро усложнить вашу кодовую базу и привести к пункту 2.
5. Влияние на вашу команду и карьеру в целом
Адаптация или онбординг. Если на каждом шагу новичкам будет нужно осваивать новую зависимость, то просто представьте, как им будет работать.
Импакт на развитие карьеры. Если вместо решения проблемы вы тащите новую зависимость, то этого может хватать до поры до времени. Но для развития иногда стоит спуститься на уровень глубже. Это реально работает и вы будете удивлены, насколько написание своей реализацией может вас прокачать в профессиональном плане.
// MARK : - Выводы
Если бездумно тащить в проект всё подряд, иногда может случиться так, что вместо развития вашего проекта вы будете искать способ поддержки зависимости, которая внезапно перестала работать по неизвестной причине.
Это не рекомендация к изобретению велосипедов. Просто иногда стоит немного внимательнее спрашивать у коллег, или у себя самого — а нужна ли нам эта либа, не рациональнее ли будет использовать своё решение?
Больше мыслей по этому вопросу можно найти тут и тут.
@iOS Dev
1. Сложность
Управление версиями, волновой эффект обновлений зависимостей, время сборок. Сторонний код сулит поддержку проблем, которые там могут возникнуть.
2. Объём кода
Это может показаться очевидным, но каждая строка кода очень важно. В одиночку каждая добавленная строка не имеет большого значения. В какой-то момент у вас появится пляж, на котором будет лежать разный мусор (технические долги, ошибки и т.д.). Наша задача как разработчиков — чистить и поддерживать этот пляж.
3. Безопасность
Тут всё понятно. Помните, если пользователь даст доступ к гео, например — в любое время, то и любая зависимость в коде может получить доступ к этому гео.
4. Разбитые окна
Идея "разбитых окон" в программном обеспечении заключается в том, что новички на проекте с большей вероятностью будут следовать установленным условностям и привычкам в кодовой базе. Если в проекте много зависимостей, то это приводит к тому, что добавляется еще больше зависимостей, не обдумывая, нужна ли эта зависимость на самом деле. Это может быстро усложнить вашу кодовую базу и привести к пункту 2.
5. Влияние на вашу команду и карьеру в целом
Адаптация или онбординг. Если на каждом шагу новичкам будет нужно осваивать новую зависимость, то просто представьте, как им будет работать.
Импакт на развитие карьеры. Если вместо решения проблемы вы тащите новую зависимость, то этого может хватать до поры до времени. Но для развития иногда стоит спуститься на уровень глубже. Это реально работает и вы будете удивлены, насколько написание своей реализацией может вас прокачать в профессиональном плане.
// MARK : - Выводы
Если бездумно тащить в проект всё подряд, иногда может случиться так, что вместо развития вашего проекта вы будете искать способ поддержки зависимости, которая внезапно перестала работать по неизвестной причине.
Это не рекомендация к изобретению велосипедов. Просто иногда стоит немного внимательнее спрашивать у коллег, или у себя самого — а нужна ли нам эта либа, не рациональнее ли будет использовать своё решение?
Больше мыслей по этому вопросу можно найти тут и тут.
@iOS Dev
Эволюция архитектуры приложения Medium iOS
Цель автора этой статьи - рассказать о состоянии проекта iOS, а также о его развитии.
Автор не рекомендует делать новую архитектуру, писать тонну неиспользуемого кода и только потом внедрять новые функции.
Многие компоненты всё ещё недоступны на уровне пакетов, но всегда есть компромисс между необходимыми усилиями и тем, насколько получится улучшить продукт именно в части инноваций.
📖 Прочитать статью можно тут.
Цель автора этой статьи - рассказать о состоянии проекта iOS, а также о его развитии.
Автор не рекомендует делать новую архитектуру, писать тонну неиспользуемого кода и только потом внедрять новые функции.
Многие компоненты всё ещё недоступны на уровне пакетов, но всегда есть компромисс между необходимыми усилиями и тем, насколько получится улучшить продукт именно в части инноваций.
📖 Прочитать статью можно тут.
Как отследить процесс установки Xcode?
Готов спорить, что хотя бы раз за всю историю обновлений из App Store вам казалось, что всё, установка остановилась, не идёт, и вообще — лучше перезагрузить и попробовать заново!
Так вот, есть способ, проверить так ли это на самом деле.
Четыре скриншота, 10 секунд на открытие и ситуация вновь подконтролем присмотром.
Сохраните, чтобы не забыть!
Готов спорить, что хотя бы раз за всю историю обновлений из App Store вам казалось, что всё, установка остановилась, не идёт, и вообще — лучше перезагрузить и попробовать заново!
Так вот, есть способ, проверить так ли это на самом деле.
Четыре скриншота, 10 секунд на открытие и ситуация вновь под
Сохраните, чтобы не забыть!
Решение загадочных проблем с разлогиниванием пользователей в iOS 15
🤔 Интересная проблема, которую, я надеюсь, вы не встречали и не повстречаете.
💻 В моём рабочем проекте была похожая история ещё до iOS 15, но само исследование привело к похожим выводам.
Тут об этом больше информации.
🤔 Интересная проблема, которую, я надеюсь, вы не встречали и не повстречаете.
💻 В моём рабочем проекте была похожая история ещё до iOS 15, но само исследование привело к похожим выводам.
Тут об этом больше информации.
9 способов прокачать производительность Swift-приложения
— Optimization Level в Build Settings. Увеличится размер билда.
— Используйте final и private для методов и классов. Ограничения: работа с подклассами и диспетчеризацией.
— Избегайте print в релизных билдах.
— Последовательный код. Когда вы добавляете новую функцию, вы форсите Swift использовать таблицу виртуализации для динамического выполнения вашего кода.
Этот пункт всегда компромисс между производительностью и чистым кодом.
— Используйте withUnsafeBufferPointer при переборе массива. Что плохого? Безопасность.
— ContiguousArray. Вставка может замедлиться.
— Используйте Values (Structs), а не References (Classes) для Array. Ограничения могут быть в зависимости от ваших структур.
— Используйте Linked List вместо Array. Cортировка или поиск могут замедлиться.
— Ограничьте Protocols классами везде, где только возможно. Расплата — в «ограничениях».
Детально по каждому пункту тут (1.2k 👏).
@iOS Dev
— Optimization Level в Build Settings. Увеличится размер билда.
— Используйте final и private для методов и классов. Ограничения: работа с подклассами и диспетчеризацией.
— Избегайте print в релизных билдах.
— Последовательный код. Когда вы добавляете новую функцию, вы форсите Swift использовать таблицу виртуализации для динамического выполнения вашего кода.
Этот пункт всегда компромисс между производительностью и чистым кодом.
— Используйте withUnsafeBufferPointer при переборе массива. Что плохого? Безопасность.
— ContiguousArray. Вставка может замедлиться.
— Используйте Values (Structs), а не References (Classes) для Array. Ограничения могут быть в зависимости от ваших структур.
— Используйте Linked List вместо Array. Cортировка или поиск могут замедлиться.
— Ограничьте Protocols классами везде, где только возможно. Расплата — в «ограничениях».
Детально по каждому пункту тут (1.2k 👏).
@iOS Dev
Туториал по созданию приложения Wordle
В двух словах, что это такое:
Это игра, в которой вам нужно угадать слово из 5 букв за 6 попыток.
Ее название - это комбинация слова «Word» и второго имени парня, который придумал эту игру и разработал оригинальную версию: Джош Уордл.
📖Автор рассказывает и показывает, как можно реализовать аналог этой игры.
🛠Исходный код: github.
@iOS Dev
В двух словах, что это такое:
Это игра, в которой вам нужно угадать слово из 5 букв за 6 попыток.
Ее название - это комбинация слова «Word» и второго имени парня, который придумал эту игру и разработал оригинальную версию: Джош Уордл.
📖Автор рассказывает и показывает, как можно реализовать аналог этой игры.
🛠Исходный код: github.
@iOS Dev
🤔 Почему ваше приложение могут не пропустить или даже удалить из App Store?
Собрал список частых причин, как делать не надо. Некоторые из них основаны и на личном опыте, о других вы могли слышать, или даже использовали сами.
1️⃣ Предлагать пользователям делать покупки на вашем сайте.
Пункт правил 3.1.3. Если ваше приложение позволяет людям покупать физические товары или услуги, которые будут потребляться за пределами приложения, вы должны использовать для сбора платежей другие способы покупки, кроме покупки в приложении, например, Apple Pay или кредитную карту.
2️⃣ Скрытие функций приложения на ревью и включение их с помощью, например, серверных изменений
Пункт правил 2.3.1. Не включайте в свое приложение никаких скрытых или недокументированных функций.
3️⃣ Реклама в push-уведомлениях или в виджетах
Пункт правил 3.2.2 — если вкратце, монетизация Push-уведомлений недопустима.
Есть нюанс в 4.5.4, где Apple говорит, что push-уведомления не должны использоваться для рекламных акций или в целях прямого маркетинга, если только клиенты не дали явного согласия.
4️⃣ Включение сторонней аналитики в приложения «для детей»
Пункт правил 1.3 говорит об этом явно
5️⃣ Сбор несанкционированных данных пользователей
В пункте правил 5.1.1. сообщается явно о том, что приложение должно собирать только информацию, необходимую для выполнения задачи.
Не стоит собирать, например, пароли кредитных карт чтобы пройти уровень.
6️⃣ Принуждение для включения трекинга. Для, например, разблокировки каких-то опций.
Пункт правил 3.2.2. Нельзя, например, выпрашивать рейтинг или включать трекинг для получения дополнительного контента.
7️⃣ Использование цифрового отпечатка устройства вместо IDFA для целей отслеживания
Отпечатки устройства или fingerprint - это идентификация устройства по его характеристикам: местоположению, данных устройства, языку и многому другому. На десктопах это проще сделать, чем на мобильных устройствах, но точность может составлять от 80% до высоких 90%.
8️⃣ Предложение спорного или даже потенциально опасного продукта
Пункт правил 1.4.3 говорит об этом явно и включает в себя, например, продукты с табаком или алкоголем.
9️⃣ Безумные цены, неадекватные продукту.
Вспомните, было приложение, за 1 000 долларов, которое называлось "я богат" или как-то так. Его удалили из апп стор, но потом вернули за 8.99. Хотя теперь можно сказать, что название приложения вводит в заблуждение.
🔟 Использование приватного API
Пункт правил 2.5.1 говорит именно об этом. Хотя одна из возможных причин, по которым форсили обновление приложений, то, что некоторые API со временем становятся deprecated.
Более развёрнуто можно прочесть на хабре.
@iOS Dev
Собрал список частых причин, как делать не надо. Некоторые из них основаны и на личном опыте, о других вы могли слышать, или даже использовали сами.
1️⃣ Предлагать пользователям делать покупки на вашем сайте.
Пункт правил 3.1.3. Если ваше приложение позволяет людям покупать физические товары или услуги, которые будут потребляться за пределами приложения, вы должны использовать для сбора платежей другие способы покупки, кроме покупки в приложении, например, Apple Pay или кредитную карту.
2️⃣ Скрытие функций приложения на ревью и включение их с помощью, например, серверных изменений
Пункт правил 2.3.1. Не включайте в свое приложение никаких скрытых или недокументированных функций.
3️⃣ Реклама в push-уведомлениях или в виджетах
Пункт правил 3.2.2 — если вкратце, монетизация Push-уведомлений недопустима.
Есть нюанс в 4.5.4, где Apple говорит, что push-уведомления не должны использоваться для рекламных акций или в целях прямого маркетинга, если только клиенты не дали явного согласия.
4️⃣ Включение сторонней аналитики в приложения «для детей»
Пункт правил 1.3 говорит об этом явно
5️⃣ Сбор несанкционированных данных пользователей
В пункте правил 5.1.1. сообщается явно о том, что приложение должно собирать только информацию, необходимую для выполнения задачи.
Не стоит собирать, например, пароли кредитных карт чтобы пройти уровень.
6️⃣ Принуждение для включения трекинга. Для, например, разблокировки каких-то опций.
Пункт правил 3.2.2. Нельзя, например, выпрашивать рейтинг или включать трекинг для получения дополнительного контента.
7️⃣ Использование цифрового отпечатка устройства вместо IDFA для целей отслеживания
Отпечатки устройства или fingerprint - это идентификация устройства по его характеристикам: местоположению, данных устройства, языку и многому другому. На десктопах это проще сделать, чем на мобильных устройствах, но точность может составлять от 80% до высоких 90%.
8️⃣ Предложение спорного или даже потенциально опасного продукта
Пункт правил 1.4.3 говорит об этом явно и включает в себя, например, продукты с табаком или алкоголем.
9️⃣ Безумные цены, неадекватные продукту.
Вспомните, было приложение, за 1 000 долларов, которое называлось "я богат" или как-то так. Его удалили из апп стор, но потом вернули за 8.99. Хотя теперь можно сказать, что название приложения вводит в заблуждение.
🔟 Использование приватного API
Пункт правил 2.5.1 говорит именно об этом. Хотя одна из возможных причин, по которым форсили обновление приложений, то, что некоторые API со временем становятся deprecated.
Более развёрнуто можно прочесть на хабре.
@iOS Dev
Как создавать fluid-интерфейсы для iOS?
Что такое fluid-интерфейсы?
Fluid интерфейс также можно назвать «быстрым», «плавным», «естественным», или «волшебным». Это когда чувствуешь, что тут всё как надо.
📖 Nathan Gitter в монументальном туториале показывает на примерах, как их можно реализовать.
Восемь интерфейсов — каждый достоин того, чтобы уделить внимание реализации.
26 000 👏 на Medium.
@iOS Dev
Что такое fluid-интерфейсы?
Fluid интерфейс также можно назвать «быстрым», «плавным», «естественным», или «волшебным». Это когда чувствуешь, что тут всё как надо.
📖 Nathan Gitter в монументальном туториале показывает на примерах, как их можно реализовать.
Восемь интерфейсов — каждый достоин того, чтобы уделить внимание реализации.
26 000 👏 на Medium.
@iOS Dev
Логарифмический контроль громкости
🔊Нашёл замечательный факт от Давида Кордеро.
Представьте, вы смотрите видео в тихой обстановке, установили минимальную громкость, а она всё равно громкая. Поэтому вы пытаетесь уменьшить её, жмёте кнопку... Иии, теперь звука вообще нет. Ну что, жизненно?😄
Или, например, в другой день вы на вечеринке слушаете музыку, но поменяв со 100 до 80% разницы практически нет.
🤔 Как такое возможно, в первом случае одним нажатием мы выключили звук, а во втором случае ничего не изменилось?
Причина в разнице между реализацией громкости и восприятием для наших ушей.
Регуляторы громкости часто реализуются линейно, но наше ухо воспринимает громкость логарифмически.
Это известный факт для аудиоинженеров, использующих децибелы (дБ) для логарифмического восприятия звука.
Поработав на ТВ Давид сделал вывод, что это непопулярное знание в отрасли, и поэтому часто реализуется неправильно.
🧑💻 Поэтому, чтобы регулировать звук корректно, используйте
@iOS Dev
🔊Нашёл замечательный факт от Давида Кордеро.
Представьте, вы смотрите видео в тихой обстановке, установили минимальную громкость, а она всё равно громкая. Поэтому вы пытаетесь уменьшить её, жмёте кнопку... Иии, теперь звука вообще нет. Ну что, жизненно?😄
Или, например, в другой день вы на вечеринке слушаете музыку, но поменяв со 100 до 80% разницы практически нет.
🤔 Как такое возможно, в первом случае одним нажатием мы выключили звук, а во втором случае ничего не изменилось?
Причина в разнице между реализацией громкости и восприятием для наших ушей.
Регуляторы громкости часто реализуются линейно, но наше ухо воспринимает громкость логарифмически.
Это известный факт для аудиоинженеров, использующих децибелы (дБ) для логарифмического восприятия звука.
Поработав на ТВ Давид сделал вывод, что это непопулярное знание в отрасли, и поэтому часто реализуется неправильно.
🧑💻 Поэтому, чтобы регулировать звук корректно, используйте
logarithmicVolume
, как на скриншоте.@iOS Dev
Как создать gradient borders в UIKit?
🛠 Filip Němeček показывает, как при помощи одного расширения для UIImage можно реализовать собственный GradientBorderView.
🛠 Filip Němeček показывает, как при помощи одного расширения для UIImage можно реализовать собственный GradientBorderView.
This media is not supported in your browser
VIEW IN TELEGRAM
Повторяем Apple Photos (и анимации), используя Compositional Layout
📷 Приложение Photos получило довольно большое обновление ещё в iOS 13, и там появились шикарные плавные анимации и переходы при переключении между представлениями "Годы, месяцы, дни" и между всеми фото. Автор решил попробовать реализовать это с помощью Compositional Layout и Diffable Data Source.
📖 В этом посте показано, как реализуется переключение по месяцам и разделом "Все фотографии". А ниже приведен готовый пример в качестве мотивации🙂.
🛠Суть туториала в том, чтобы показать, как подходить к таким макетам, как делить их на отдельные задачи и как переходить между совершенно разными состояниями.
📷 Приложение Photos получило довольно большое обновление ещё в iOS 13, и там появились шикарные плавные анимации и переходы при переключении между представлениями "Годы, месяцы, дни" и между всеми фото. Автор решил попробовать реализовать это с помощью Compositional Layout и Diffable Data Source.
📖 В этом посте показано, как реализуется переключение по месяцам и разделом "Все фотографии". А ниже приведен готовый пример в качестве мотивации🙂.
🛠Суть туториала в том, чтобы показать, как подходить к таким макетам, как делить их на отдельные задачи и как переходить между совершенно разными состояниями.