iOS Broadcast – Telegram
iOS Broadcast
3.46K subscribers
1.85K photos
86 videos
1.04K links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🐥 Swift Concurrency: как избежать retain-циклов в Task
Работа с async/await и Task в Swift сильно упрощает асинхронный код, но ARC всё ещё делает своё — задачи захватывают объекты, которые используются внутри тела, и могут неявно удерживать память дольше, чем вы думаете. Это может привести к retain-циклам даже без UIKit-замыканий.

Что происходит под капотом:
🔵Когда вы создаёте Task { … }, Swift сильно удерживает все объекты, на которые ссылается тело задачи. Это стандартное поведение ARC: задачи держат захваченные значения до завершения.
🔵Если у вас есть объект, который сохраняет задачу как своё свойство, и в теле задачи вы захватываете self, получается временный retain-цикл: Owner → task → Owner
🔵Задача отпустит захваченные значения когда она завершится — так что цикл существует только на время выполнения задачи.

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

Как избежать retain-циклов?
🟡Слабые захваты weak self в задачах
task = Task { [weak self] in
guard let self else { return }
await self.loadData()
}


🟡Отмена долгоживущих задач
Если ваша задача запущена на View и должна завершиться при исчезновении UI — отменяйте её вручную: task.cancel(). Task отменяется, и память освобождается быстрее
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🤔1
🔨 Stanford CS193p лекция 3 Model & UI + Swift Type System
В новой лекции разбираются фундаментальные принципы работы SwiftUI через призму архитектуры модели и системы типов Swift — то, что определяет устойчивость и масштабируемость iOS-приложений.
Перемешивание UI и логики. Во многих SwiftUI-проектах View начинает обрастать обязанностями: хранением данных, обработкой логики, сетевыми вызовами. Это приводит к:
🟡Трудному тестированию
🟡Отсутствию переиспользования
🟡UI, зависимому от внутренних деталей хранения данных

Чёткое разделение Model ↔️ View
Связка Model и UI — центральная концепция лекции. SwiftUI ожидает, что:
🟡Model хранит истинное состояние и бизнес-логику.
🟡View — чистая функция состояния: она описывает интерфейс, но не владеет логикой.
Это делает приложение устойчивым к изменениям и легко тестируемым.

Swift Type System как фундамент архитектуры. Лекция подчёркивает важность системы типов Swift:
🟡Struct как основной строительный блок данных. Value-semantics уменьшают количество багов, связанных с состоянием.
🟡Enum + associated values. Мощный инструмент для моделирования состояний экрана: loading / success / error.
🟡Optionals. Встроенная безопасность, которая заставляет проектировать модель осознанно.
🟡Immutability по умолчанию. View остаются предсказуемыми, изменения происходят только в модели.

MVVM как естественный путь
CS193p фактически показывает MVVM-подход, но без перегибов:
🔵Model — данные и логика.
🔵ViewModel — источник правды для View, объявленный через @Observable / @StateObject.
🔵View — рендер состояния, без тяжёлой логики.

Выводы:
🔵Избегайте логики в View — переносите в модель или ViewModel.
🔵Используйте enum-состояния для сложных процессов (загрузка, ошибки, пустые состояния).
🔵Стройте данные на основе struct — меньше сайд-эффектов и легче тестировать.
🔵Используйте Optional осознанно: они должны отражать реальную модель данных.
🔵Делайте View чистой функцией состояния — UI становится стабильнее и проще.
#cs193p
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1