iOS Dev
Open in Telegram
👨💻Автор: Виктор Грушевский (@Viktorianec) ⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru 🍏Канал об iOS-разработке, алгоритмах и архитектурах ⭐️ Подготовка к собесам ⭐️ Код. Много кода. #ios #mobile #swift
Show more7 998
Subscribers
+824 hours
+327 days
+7530 days
Posts Archive
7 998
Утечки памяти в Swift: что с ними делать, как предотвратить?
Возможно, одна из самых неприятных, но в то же время часто встречающихся в практике историй - поиск утечек памяти.
Даже у нас на проекте сейчас одна из тасок - поиск вещей, связанных с экранами звонков и лайвкитом, в частности.
Кроме классических вариантов с циклическими ссылками (когда у нас есть дочерний контроллер, который хранит ссылку на своего владельца/родителя), может быть куча других проблем: от казалось бы очевидных вещей с таймерами до замыканий и делегатов.
В закрытой базе я попробовал структурировать наиболее частые ситуации, которые могут встречаться в нашей работе, добавил классификацию по степени того, насколько вообще они могут встречаться, основываясь на своём опыте и опыте коллег, но не только это.
Есть несколько полезных задач на подумать: при работе с сетью, что не так с NotificationCenter и многое другое.
Подписаться можно тут: 💰 с приятными условиями на бусти ⭐️ в телеграме.
А пока можно вспомнить и про эти истории:
📖 Утечка памяти: детектив в Xcode
📖 Как автоматически обнаруживать утечки памяти с помощью UI-тестов
📖 Управление памятью в Swift
😃 iOS Dev
7 998
iOS-разработчики получают самую высокую зарплату в России согласно исследованию хабра. Так ли это на самом деле?
Я проверил это с помощью масштабного опроса и поделился выводами.
Кроме аналитики, есть и сравнение с реальными европейскими зарплатами в нашей и смежных сферах, а также отслеживание динамики изменений.
✅Подпишитесь, чтобы посмотреть результаты на бусти и в телеграме (действует специальное предложение).
🧠 А ещё вы сможете получить: ➡️Карта изучения Swift Concurrency ➡️Вопросы на чтение кода ➡️Многопоточность ➡️DispatchQueue: практические вопросы ➡️Swift Concurrency ➡️Алгоритмы: терминология и примеры ➡️Память: ARC, side table, флаги, утечки ➡️Разбор подходов к анимациям и лучшие паттерны. А также доступ к ранним релизам приложения iOS IQ, тонну теории и многое другое.😃 iOS Dev
7 998
Что изменилось в работе со строками в Swift 6.2
Если раньше для опционального значения и использования в коде ниже было предупреждение
String interpolation produces a debug description for an optional value; did you mean to make this explicit?:
let age: Int? = nil
print("Your age: \(age)")
И компилятор предлагал юзать String(describing:), чтобы избавиться от ворнинга, то теперь все стало проще.
📖 В этом пропозале принят вариант, который позволяет записывать предполагаемое значение по умолчанию в виде строки, независимо от типа.
let age: Int? = nil
print("Your age: \(age, default: "missing")")
// Prints "Your age: missing"
Это дополнение также повышает и ясность кода вместо того, чтобы допускать nil-утечку в строковый вывод.
Расширенный список принятых пропозалов - в этом посте.
😃 iOS Dev7 998
🚪 Превращаем макбук в скрипящую дверь с помощью датчика наклона (есть звук)
Оказывается, есть специальное (непубличное API), доступное аж с 2019. Впервые появилось в 16-дюймовом макбук про и если ваш ноут более новый, то оно скорее всего также доступно.
📖 В этой репе можно посмотреть на пример тестового проекта.
А если вам вдруг понадобятся весы, а под рукой только ваш ноутбук, напомню про этот пост.
😃 iOS Dev
7 998
Быть инженером
Прочитал кайфовую историю, как Вадим интегрировал себе PassKit за несколько часов разработки, чтобы вместо 47 секунд тратить 3 на вход в тренажёрку 💪
Разве не в этом смысл быть разработчиком вообще? Упрощать жизнь, делать привычные действия быстрее или вообще автоматизированными.
В своём приложении Starly я также бился с возможностью упрощения и экономии личного времени. У меня сейчас порядка 20 пет-проектов, из которых я поддерживаю около 7. И представьте, что в каждом по 15 локализаций. Сколько времени надо на переводы?
Ну по классике: прикрутил SDK для работы с AppStore Connect, лупанул туда движок DeepL (и есть ещё кое-какой хак, как в телеге). Хотя можно подумать сейчас и над чем-то более весёлым в современных реалиях)
Так вот, вместо 1.5 часов просто на то, чтобы вбить переводы, я трачу около 2 минут - пишу текст обновления на русском или английском, а алгоритм под капотом делает всё остальное за меня.
Или вот надо было зарефакторить большой проект (всё еще надо) - сделал себе подсчёт строк в каждом файле, чтобы понять, с чего вообще начать.
А ещё когда-то пилил скрипт на питоне, чтобы спарсить все оценки с кинопоиска и перенести на letterboxd автоматически (киноманы поймут, о чём речь, когда у вас просмотренных тысяча фильмов). Думал даже выложить его в открытый доступ, но решил, что слишком маленькая аудитория.
А что для вас быть инженером? Используете ли вы свои навыки вне работы?
Может у вас есть пет-проект, о котором вы бы хотели рассказать - поделитесь!
😃 iOS Dev
7 998
Что нового в Swift 6.2 (помимо обновлений, связанных с параллелизмом)
📺 Неплохой разбор нововведений, которые появятся в iOS 26 и Xcode 26.
И хотя основное внимание все уделяют concurrency, есть и много других фич, о которых можно узнать.
Среди разобранных пропозалов:
➡️ Default Value in String Interpolations
➡️ Raw identifiers
➡️ Collection conformances for enumerated()
➡️ InlineArray, a fixed-size array
➡️ InlineArray Type Sugar
➡️ Integer Generic Parameters
➡️ Span: Safe Access to Contiguous Storage
😃 iOS Dev
7 998
SwiftUI WebView: настройка, навигация, кастомные схемы
На WWDC 2025 был анонсирован WebView для SwiftUI, но код из видео не работал, более того, он даже не компилился.
📖 В этой статье можно посмотреть на основные аспекты работы, пример навигации и работу с JavaScript-функциями.
🛠 Код проекта доступен и на GitHub.
😃 iOS Dev
7 998
Что там по Swift Concurrency да и вообще по целям?
Или как говорится, у меня была какая-то практика, и я её придерживался.
За последнее время я как и прежде, продолжаю регулярно обновлять приложение, наполнять вопросами (из проверенных источников и рабочих кейсов, а не из аи-слопа, которым наводнено к сожалению множество каналов, и, к сожалению - хабра и медиума).
Кстати, совсем скоро выйдет и новая версия приложения, которое в бете уже месяц.
Сделал карту изучения Swift Concurrency, опубликовал сайт, продолжаю наполнять базу качественным контентом сразу по нескольким направлениям, которые непосредственно связаны с рабочими задачами.
🤖 Ботом воспользовалось уже около тысячи человек, и вот первые выводы.
Кайф, что все работает стабильно, все метрики в норме, ожидал проблем. В комментарии канала написали несколько десятков человек с конструктивными предложениями и это здорово (пишите и вы)!
Подпишитесь 💰 на бусти и ⭐️ прямо здесь и получите доступ к эсклюзивному и качественному контенту.
✅С вас подписка по специальному офферу - с меня все нижеперечисленное (и даже больше).
Что можно получить сегодня? ➡️Несколько десятков пройденных алгоритмических задач с боевых конкурсов. ➡️Вопросы на чтение кода ➡️Многопоточность ➡️DispatchQueue: практические вопросы (две части) ➡️Swift Concurrency ➡️Память: ARC, side table, флаги, утечки ➡️UIKit (теория + практика, две части) ➡️Компилятор Swift ➡️Основы: URLSession, UICollectionView и многое другое. А также: ➡️Множество необычных подходов к анимации (включая шейдеры). ➡️Разбор популярных архитектур (и их недостатков). ➡️Несколько кайфовых и интересных фактов об истории прототипирования в Apple. ➡️Как на самом деле работает Code Signing. ➡️Несколько трюков и фишек при работе c Xcode.😃 iOS Dev
7 998
А вы знали, что системный UIDatePicker (даже в напоминаниях и часах) - на самом деле не бесконечная лента?
Иногда в работе всем приходится решать баги, прилетающие от отдела QA, которые встречаются у пары пользователей или при определённой фазе Луны.
Что делает в таком случае Apple?
Ответ - решают проблемы остальных 99.99% пользователей.
Да и вообще это что, в первый раз?
😃 iOS Dev
7 998
Four Corners: первая игра, целиком написанная на Swift для Playdate
В канале я часто пишу про необычные решения, а ещё немного коллекционирую самые разные игровые приставки (ха-ха, про это можно было даже написать в посте про Японию).
Например, из последней поездки притащил Game Boy Micro Anniversary Edition, пусть и немного потрёпанную временем).
Одна из приставок в коллекции - Playdate (и она как раз на фотке к этому посту).
И для неё с недавних пор можно писать на Swift!
Нашёл интересное интервью со Стивеном Чипманом, который рассказал о плюсах о всей боли, которая сопутствовало процессу переписывания приложения с Lua.
Например, недоступен Foundation, а ещё нет Codable, что превратило работу с JSON в нетривиальный таск.
Особое внимание пришлось на процесс отладки. Например, в рантайме если приложение крашится - то мы не можем даже получить стектрейс.
📖 В общем, рекомендую почитать, особенно если вам интересен и embedded swift, в частности.
📺 А тут можно посмотреть и доклад на тему.
😃 iOS Dev
7 998
🍾 Бот для проверки знаний по iOS и подготовке к собеседованиям
У меня отличная новость! Открываю бета-тестирование бота по iOS.
Есть несколько режимов, бесконечный и режим собеса. И реализована таблица лидеров (не переживайте, ваши результаты для всех анонимны).
Реализовал на firestore+cloud functions+telegram bot api на node.js.
Сейчас крутится один инстанс, посмотрю как будет по нагрузке в дальнейшем.
🤖 Запустить и проверить себя можно здесь: @iOSIQBot
Для трибьюта и телеги я реализовал кроссчек подписок (бусти по чату) и выкатил бонусный премиум-режим.
Не забудьте подписаться и вы 💰 с приятными условиями на бусти в ⭐️ в телеграме.
Ах да, специальный бонус тому, кто наберёт больше всех очков в конце недели: будет пасхалка от меня в буквальном смысле.
🎁 Поддержать разработку.
😃 iOS Dev
7 998
Как мигрировать UIKit-интерфейс на scene-based в iOS
Для iOS 18.4 и выше уже сейчас вы можете видеть сообщение в консоли для старых неадаптированных проектов:
вам нужно всего лишь:
1. Добавляем саппорт сцен в plist:
This process does not adopt UIScene lifecycle. This will become an assert in a future version.А кто ставил бетку Xcode и пробовал собрать для 26 оси, наверняка видели и сообщения пострашнее:
UIScene lifecycle will soon be required. Failure to adopt will result in an assert in the future.В следующем за 26 осью мажорном релизе приложение, основанное не на сценах вообще не запустится. Сейчас я работаю над большим проектом, в котором до сих пор не только многое на Objective-C, но и одна из задач в текущих релизах - заадоптить саппорт для CarPlay, так что здесь без корректного перехода на сцены ничего бы не получилось. На самом деле всё довольно просто, для этого
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
// Скорее всего, в небольших проектах достаточно будет одной сцены, но если у вас mac catalyst, например - то поддержка мультисцен буквально мастхэв для многих кейсов.
2. Кроме этого, нужно задать конфиг для каждой из использующихся в проекте сцен:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
// Each UISceneConfiguration have a unique configuration name.
// The configuration name is a app-specific name
// you use to identify the scene, and it corresponds to entries
// in the `Info.plist` scene manifest.
var configurationName: String!
switch options.userActivities.first?.activityType {
case UserActivity.GalleryOpenInspectorActivityType:
// Create a photo inspector window scene.
configurationName = "Inspector Configuration"
default:
// Create a default gallery window scene.
configurationName = "Default Configuration"
}
return UISceneConfiguration(
name: configurationName,
sessionRole: connectingSceneSession.role
)
}
}
3. И запилить метод willConnectTo:
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
// Confirm the scene is a window scene in iOS or iPadOS.
guard let windowScene = scene as? UIWindowScene else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = YourRootViewController()
window?.makeKeyAndVisible()
}
}
Сама логика останется буквально той же, за небольшой поправкой, что ваш код из applicationDidBecomeActive(_:) надо перенести в sceneDidBecomeActive(_:), и так далее.
Целиком разбор и советы от Apple можно посмотреть здесь (в TN3187).
😃 iOS Dev7 998
Реализация шейдера с события Apple 9 сентября (Metal + SwiftUI)
Признаюсь, в этот раз было непросто, сначала думать идти через путь svg-path для яблока + последующая работа с кривыми, но в итоге остановился на чистой математике с отрисовкой в коде.
Также добавил эффект затухания в зависимости от временной метки и небольшой эффект морфинга с объектами.
На гифке используются жесты для управления позицией и все вышеперечисленное вместе.
✅Конечно же, код уже доступен на бусти (там объясняю, как это можно реализовать у себя и настроить хоть радиус откуса 🍏, хоть эффект перехода для нашего heatmap, и на девайс можно накатить тоже, попробовать).
А ещё в трибьют-боте (условия приятнее).
📖 А стартовые посты для изучения Metal: вот этот, этот и этот. А вот тут, например, можно чекнуть как реализовать хитмап на шейдертое, без затухания и без временных меток, но как стартовая точка вполне подойдёт.😃 iOS Dev
7 998
Как проверить, сколько памяти доступно приложению (и как увеличить этот лимит)
Пока все ищут способы снизить потребление памяти и оптимизируют приложение, вкручивая более производительные алгоритмы, тем временем Apple с 15 iOS добавили специальный entitlement.
С помощью этого разрешения можно сообщить, что некоторые основные фичи приложения могут работать лучше, если превысить стандартный лимит памяти приложения на поддерживаемых устройствах.
Кто-то его использовал?
📖 Кстати, чтобы проверить, сколько вообще доступно - можно чекнуть метод os_proc_available_memory (предварительно импортнув os).
😃 iOS Dev
7 998
Главный софтскилл
Прав ли тот, кто кричит громче всех?
С моей точки зрения, при обсуждении задач главное не доказать свою правоту, а найти общую истину.
Если в коллективе будет понимание этого принципа, то продукт будет развиваться, а коллективная эмпатия, если такой термин существует - будет только расти.
Часто в больших коллективах встречаются истории, когда два человека, а иногда и больше - настаивают только на своей точке зрения, будто бы она единственно верная, игнорируя доводы и конструктив.
Похожие истории могут встречаться не только в IT, но и в любых дебатах (политических, культурных, да и любых других тоже).
Отличие тех же каналов в телеге (или, например, хабра) от иных ресурсов, что многие авторы в СНГ своей путеводной звездой считают принизить остальных, найти проблемы, указать на ошибки (даже если их нет). Эту историю легко спроецировать и на обсуждения внутри коллективов, внутри вашей компании или стартапа.
При реализации каких-то крутых анимаций или забавных эффектов я всегда поддержу автора, потому что выйти из плоскости, найти необычное применение, понять как можно прокачать привычные вещи - не менее важно, чем наличие технической базы.
Навык общения не менее, а иногда и более важен, чем все ваши знания вместе взятые.😃 iOS Dev
7 998
Контроль и оптимизация процесса декодирования изображений в iOS
Каждый разработчик так или иначе сталкивается со сложностями при работе с изображениями. Кто-то пытается найти выход через сторонние фреймворки, но многие выбирают сложный путь и ищут подходящие API в доступных нам фреймворках.
Например, на выходных я в одном из своих проектов искал путь к оптимизации генерации кадров для длинных видео (спойлер, решил через длину шага в зависимости от длительности исходного видео и качества самих thumbnails).
Эффективная работа с изображениями стоит на трёх китах: на сколько мы грузим проц, эффективно ли используем оперативку и записи на устройство (кэшировании).
📖 В этой статье основное внимание уделяется использованию процессора, в частности, когда происходит фактический процесс декодирования, а также тому, в каком потоке и на каком этапе рендеринга это происходит.
Кроме очевидных советов на счёт переноса тяжёлой работы с основного потока и использования превьюх, можно почитать и про
CVPixelBuffer, и про полезные практики.
😃 iOS Dev7 998
База знаний iOS IQ
Напомню, что у канала есть и приятное дополнение с большим количеством уникальных тем и авторских разборов.
Вы можете использовать её не только для подготовки, но и для проведения собеседований.
В ней есть не только разборы фундаментальных принципов, но и современные подходы, которые упростят решение многих повседневных задач.
🤩 Ближайшие несколько дней доступ можно получить:
💰 с приятными условиями на бусти
в ⭐️ в телеграме.
🧠 Что вы получите, подписавшись сегодня:
➡️Разбор нескольких сотен вопросов на сложные темы ➡️Вопросы на чтение кода ➡️Многопоточность ➡️DispatchQueue: практические вопросы ➡️Swift Concurrency ➡️Алгоритмы: терминология и примеры ➡️Память: ARC, side table, флаги, утечки ➡️Множество анимаций, шейдеров и не только✅А также доступ к ранним релизам приложения iOS IQ, тонну теории и многое другое. P.S. Многие продукты я делаю на чистом энтузиазме и в качестве экспериментов, а бусти - это ваш способ поддержать автора и будущие разборы. Подписывайтесь (кстати, с недавних пор база доступна и в офлайне - инструкция уже есть по ссылке). 😃 iOS Dev
Available now! Telegram Research 2025 — the year's key insights 
