Kotlin/Native: память и граница Swift
GC, ошибки, suspend и явный срок жизни подписок
Это другой runtime
Kotlin/Native компилирует код в нативный бинарный файл и управляет Kotlin-объектами через GC. Это не означает, что каждый объект управляется Swift ARC. Мост связывает разные модели владения; освобождение Kotlin-объекта не обязано произойти сразу после исчезновения последней Swift-ссылки. Память Kotlin/Native.
Особенно внимательно проверяйте смешанные циклы: Swift-объект удерживает Kotlin-объект, а тот — Swift-владельца. Наличие tracing GC на Kotlin-стороне не гарантирует освобождение такого графа с ARC-объектами. Разрывайте цикл явным освобождением подписки или подходящей слабой ссылкой; выбор зависит от договора владения. Интеграция с ARC.
Старая модель с обязательным freezing для разделяемых объектов больше не является правилом современного Native: новая модель включена по умолчанию с Kotlin 1.7.20, старая удалена в 1.9.20. Отсутствие freezing не делает конкурентные мутации безопасными. Новая модель памяти.
Укажите, о каком экспорте идёт речь
Далее рассматривается framework с Objective-C interop, не отдельный механизм Swift export и не сторонние плагины. Обычная функция без suspend, помеченная @Throws, экспортирует перечисленные Kotlin-исключения как NSError/Swift throws. Необъявленное исключение на этой границе может завершить процесс; общий do/catch в Swift не является универсальным спасением. Kotlin: Swift/Objective-C interop.
class InvalidName : Exception()
@Throws(InvalidName::class)
fun normalizeName(raw: String): String {
val name = raw.trim()
if (name.isEmpty()) throw InvalidName()
return name
}
Асинхронность требует договора
Через Objective-C мост suspend-функции представлены completion handler; Swift 5.5+ также может предоставлять async-вызов, с ограничениями, указанными в документации Kotlin. Без @Throws suspend-функции передают через NSError только CancellationException. Не переносите на этот мост ожидания от произвольного Swift-native API. Kotlin: Swift/Objective-C interop.
Для наблюдения Flow задайте владельца подписки и явный stop/cancel. Не считайте, что уход SwiftUI view автоматически отменяет любую Kotlin Job: это обязанность выбранной интеграции. UI-обновления также должны соответствовать требованиям главного потока/актора приложения.
Основа отбора: KMP-вопросы draft/faq500.md; новая подтема разработана по документации Native. Конкретный Swift export не объявляется стабильным или эквивалентным Objective-C мосту.