iOS Broadcast
3.49K subscribers
2.14K photos
88 videos
1.15K links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🐥 Новый warning в Swift 6.4 про weak self, который реально полезен
После последних proposal, на которых основано текущее поведение захватов
➡️ SE-0365 — Allow implicit self for weak self captures
➡️ SE-0269 — Increase availability of implicit self in escaping closures

Появилось важное изменение в Swift Compiler
➡️ Request for feedback: emitting warnings when weak capture list items cause strong captures

Давайте разберемся в чем суть:
С захватом слабых ссылок в замыканиях всё давно понятно. Есть риск retain cycle, пишем:
{ [weak self] in
self?.update()
}


Но есть неприятный случай с вложенными замыканиями, который раньше Swift вообще не подсвечивал:
Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { _ in
service.load { [weak self] result in
self?.result = result
}
}

Выглядит безопасно. self ведь захватывается слабой ссылкой. Но только во внутреннем замыкании. Чтобы внутреннее замыкание вообще смогло создать weak self, внешнему замыканию тоже нужен доступ к self. И Swift неявно захватывает его там уже сильной ссылкой. Получается примерно такая цепочка:

self → Timer → внешнее замыкание → self

И здравствуй retain cycle. Самое неприятное, что в Swift 6.3 такой код спокойно компилировался без единого предупреждения. В Swift 6.4 это наконец меняется. Компилятор покажет:
'weak' ownership of capture 'self' differs from implicitly-captured strong reference in outer scope

То есть буквально:
Ты во внутреннем замыкании захватываешь self слабо, но снаружи я уже неявно захватил его сильно.
Как исправить?

В большинстве случаев достаточно перенести захват слабой ссылки во внешнее замыкание:
Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { [weak self] _ in
service.load { result in
self?.result = result
}
}

Теперь внешнее замыкание хранит только слабую ссылку на self, и цикл разрывается. Если же self нужен и внешнему, и внутреннему долгоживущему замыканию, слабый захват может понадобиться на обоих уровнях. А если сильный захват действительно безопасен, например внутри короткоживущего Task, его теперь можно просто указать явно через [self].

Swift не вводит очередное правило владения памятью. Он просто начинает предупреждать о том, что язык и раньше делал неявно, но что было очень легко пропустить глазами. Начиная со Swift 6.4 компилятор хотя бы начнёт смотреть на это вместе с нами 👨‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥3
⚡️Презентация Apple уже сегодня
В 20:00 ждём новые складные и обычные iPhone, iPad и Apple Watch

Ссылки на трансляцию:
🎞 YouTube
🍏 Сайт Apple

И, как обычно, под этим постом буду писать первые впечатления во время презентации и приглашаю вас присоединиться к обсуждению. Давно всё-таки не было чего-то по-настоящему нового 🥳
Please open Telegram to view this post
VIEW IN TELEGRAM
3
⚡️Apple Event новинки
📱Начали с iPhone 18 Pro and iPhone 18 Pro Max:
🟡A20 Pro:2-нанометровая архитектура, 2 новых "супер ядря", 4 новых эффективных ядря. 7-ядерный GPU
🟡48MP главная камера
🟡Уменьшили Dynamic Island - теперь до 3 live activities одновременно
🟡4 цвета: черный, голубой, серебристый и винный
🟡Цена iPhone 18 Pro - 1,199$ и 1,299$ за Max, оба 256Гб
🔴Подорожание на 100$ с прошлого года

🎧 AirPods 5
🟡Улучшенная звукоизоляция на 50%
🟡129$ за базовую версию и 159$ с сенсорным управлением

⌚️Apple Watch Series 12 и Apple Watch Ultra 4
🟡Улучшили отслеживание сердцебиения
🟡Новый чип S11
🟡24ч время жизни от заряда у 12 и 50 у Ultra
🟡Ускорили зарядку
🟡Вернули вариант керамического корпуса для S12
🟡Series 12 - 399$, Ultra 4 - 799$

⚡️iPhone Duo
🟡3 экрана
🟡Чип A20
🟡2 камеры: 48-мегапиксельная основная камера и телефото
🟡Камера спрятана за дисплеем
🟡Титановый корпус
🟡Соотношение 1/1.4 и в открытом и закрытом состоянии
🟡7.6-дюймов в раскрытом состоянии, 5.4-дюйма внешний
🟡Заметно переработали iOS для работы с iPhone Duo
🟡Откатились к TouchID
🟡Сенсоры положения в каждой половинке
🟡Новый режим ожидания, доступный не только на зарядке
🟡от 1999$ за 256Гб
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
10🤔4👍1
📱 Подготовьте свои приложения для iPhone Duo
Apple выпустила целый раздел для разработчиков по адаптации приложений для iPhone Duo, давайте разбиарться! Начнем с
🟡Приложения будут работать криво в режиме совместимости как iPhone приложения на iPad
🟡Если собрать с iOS 27 SDK то будет уже фулскрин в режиме совместимости (черный статус-бар)
🟡При сборке с iOS 27.1 SDK можно сделать пополноценную поддержку
🟡Apple предлагает ориентироваться на доступное пространство через size classes. Для SwiftUI используется .enviroment
🟡На внешнем экране Duo всё выглядит примерно как на обычном iPhone.
🟡На внутреннем экране имеет regular size class сразу по горизонтали и вертикали и спокойно помещает sidebar
🟡Внутренний экран вообще не обязан соблюдать ваши supportedInterfaceOrientations.
🟡У Duo два дисплея, поэтому понятие UIScreen.main становится неоднозначным. Apple прямо говорит, что такие обращения будут deprecated
🟡Если реально нужен экран конкретного окна, получаем его через UIWindowScene:
window?.windowScene?.screen
🟡Лучше вообще работать через environment, traits и размеры самой scene.
🟡Ещё одна ловушка — safe area теперь может быть асимметричной width - leftInset * 2 больше не гарантирует правильный результат Левый и правый inset могут отличаться из-за формы устройства, камеры и системного UI. Apple советует считать каждую сторону отдельно и держать весь интерактивный UI внутри safe area, а фон уже спокойно растягивать edge-to-edge.
🟡Если вы используете стандартную навигацию, большая часть адаптации приезжает бесплатно.
NavigationSplitViewUISplitViewControllerTabViewUITabBarController, sheets, popovers и alerts уже умеют адаптироваться к разным положениям Duo
🟡На внутреннем экране даже можно автоматически превращать tab bar в sidebar.
🟡А в iOS 27.1 появилась ещё одна интересная штука: ReservedRegion в SwiftUI и UIViewReservedRegion в UIKit. Она нужна кастомному edge-to-edge UI, чтобы сказать системе: дай мне максимум пространства, но не залезай туда, где уже живёт системный интерфейс.
🟡В Xcode 27.1 через Device Hub можно симулировать разные состояния Duo: открыть, закрыть, повернуть, сложить и посмотреть, как ваш layout переживает всё это
🟡Появился новый AI скил для адаптации новых практик

Главный вывод после просмотра довольно приятный: iPhone Duo не приносит какой-то отдельный "FoldableKit". Apple просто продолжает давить в сторону адаптивного интерфейса:
🟢не угадывать устройство
🟢не ориентироваться на конкретную ширину
🟢не считать, что экран один
🟢не предполагать симметричные safe areas
Если вы уже следовали этим правилам, у вас будет минимум работы по адаптации
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81