isolated deinit: уборка на экзекьюторе актора 🕴
🔥 SE-0371 «Isolated synchronous deinit» (Swift 6.2). По умолчанию deinit нонизолированный, поэтому изолированное состояние в нём трогать нельзя. isolated deinit перед выполнением переключается на экзекьютор актора. Правило, о котором обычно не пишут: голое isolated deinit легально только у акторов и классов, изолированных глобальным актором. На обычном классе это ошибка — но @MainActor deinit {} там разрешён, и это как раз рабочий обходной путь. Наследники могут добавить изоляцию к нонизолированному deinit базового класса, но не убрать и не поменять.
⚠️ Главный подвох — недетерминированность. Изолированный deinit может быть поставлен в очередь и выполниться «позже». Пропозал прямым текстом не советует применять его к дефицитным ресурсам вроде файловых дескрипторов и соединений — для них лучше with-стиль или явный close(). И ещё одна тихая деталь: task-local значения внутри изолированного deinit недоступны — они молча возвращают дефолты.
#Swift #SwiftConcurrency #Actors #iOSDevelopment #MemoryManagement