Утечка памяти в структурах Swift. Как это исправить?

Я разрабатываю приложение в Swift 2 (Xcode 7 beta 3), и, когда это возможно, я пытаюсь использовать типы значений (структуры и перечисления). Согласно документации Apple относительно управления памятью, работа с типами значений не должна вызывать каких-либо циклов сохранения, и она должна просто работать.

Но сегодня я столкнулся с огромным количеством утечек памяти в коде обработки событий. Я отследил его и уменьшил проблему до следующего минимального примера.

Предположим, что существует элемент протокола, который определяет одно value свойства:

 protocol Item { var value: String { get } } 

Затем мы создаем конкретную структуру, которая реализует протокол Item и добавляет дополнительное свойство additionalValue . Назовем struct FooItem .

 struct FooItem<T>: Item { let value: String let additionalValue: T init(value: String, additionalValue: T) { self.value = value self.additionalValue = additionalValue } } 

Третья часть головоломки – это другая структура, которая обертывает элемент, реализующий протокол Item . Это называется ItemWrapper .

 struct ItemWrapper { let item: Item init(item: Item) { self.item = item } } 

Если в приложении «Инструменты» используется конфигурация «Утечки памяти», утечка памяти появляется каждый раз, ItemWrapper значение ItemWrapper создается с помощью FooItem .

 let item = FooItem(value: "protocol value", additionalValue: "foo item value") let _ = ItemWrapper(item: item) 

Инструменты скриншот 1Инструменты скриншот 2

Вот пример проекта Xcode и файла Instruments : https://www.dropbox.com/s/z6ugxzxqggrv1xl/SwiftStructsMemoryLeak.zip?dl=0

Весь пример кода можно просмотреть в этом Gist: https://gist.github.com/lukaskubanek/4e3f7657864103d79e3a

Вот отчет об ошибке: rdar: // 21375421

Это ошибка в компиляторе Swift, или я делаю что-то неправильно?


EDIT 1 : Как было предложено в комментариях, я перепробовал этот вопрос на форуме Apple Dev , чтобы привлечь больше внимания со стороны сообщества Swift и, возможно, от разработчиков языка. Из-за миграции форумов dev во время WWDC 2015 я должен был опубликовать обновленный вопрос на новых форумах. Вот ссылка: https://forums.developer.apple.com/message/9643


EDIT 2 : Проблема, которую я изначально разместил в примере кода, кажется, разрешена в Swift 2.0 . Поскольку это не решило проблемы в моем приложении, я сделал еще одну модификацию кода примера. Теперь дополнительное свойство FooItem имеет общий тип, а FooItem аннотируется типом и, следовательно, общим типом. Вот как я использую его в своем приложении, и он по-прежнему вызывает утечку памяти, но на этот раз, когда ItemWrapper инициализируется, а не при доступе к свойству.


РЕДАКТИРОВАТЬ 3 : Полностью обновить вопрос к модифицированной проблеме, которая сохраняется в Swift 2.0 и загружена новая версия проекта Xcode.

2 Solutions collect form web for “Утечка памяти в структурах Swift. Как это исправить?”

Хотя у меня нет ответа от Apple ни на форумах разработчиков, ни в трекерах по ошибкам, и я не нашел ничего связанного с этой проблемой в примечаниях к выпуску последних бета-версий, это похоже на решение в компиляторе Swift в Xcode 7 beta 5 . (Возможно, он также работает в бета-версии 4. Последняя версия, которую я проверил, была бета-версией 3.)

Демонстрационный проект больше не создает утечку памяти. То же самое верно для моего приложения. Ура!

введите описание изображения здесь

Ну, вот обходной путь, хотя я понятия не имею, почему это работает. Я заметил, что если вы это сделаете:

  let theItem = itemWrapper.item let value = theItem.value 

…вместо этого:

  let value = itemWrapper.item.value 

… он не генерирует утечку памяти.

  • Локализовать строковые строки iOS + ресурсы с помощью Xcode 7
  • Major Bug, Sprite Atlas, созданный в XCAssets Folder, не поддерживает пакетную визуализацию
  • Мой xcode показывает две ветви, открытые одновременно с контролем источника
  • Не удалось создать разборку для фрейма стека, потому что URL-адрес не может быть переведен
  • Как изменить цвет и шрифт заполнителя UITextfield с помощью swift 2.0?
  • Локализация в Swift 2
  • Я создал одно расширение строки для объединения строки с пространством в swift 2.0, но не работает в swift 2.1 xcode 7
  • Отсутствие библиотеки .dylib при открытии в Xcode 7 beta
  • Xcode - как установить разные идентификаторы пакетов для разных конфигураций сборки?
  • Как проверить, iPad ли iPad Pro
  • Xcode и Github не играют вместе
  • Interesting Posts

    Какова логика наличия изменяемых и неизменных версий классов, таких как NSArray, NSDictionary и т. Д. В Objective C?

    Скручивание изображения вокруг, как монета

    Использование UIGraphicsPushContext (контекст) и UIGraphicsPopContext ()

    Срок службы URL-адреса «Аванс»?

    Адаптивная раскладка для iPad

    Принуждение UIActionSheet к использованию определенной ориентации

    Список неправильных параметров вызова Swift Function

    Как назвать кнопку возврата в UISplitViewController

    Кросс-платформенные мобильные фреймворки с поддержкой собственного кода

    когда использовать шоу Segues & когда использовать Show detail Segues

    Автоматическая компоновка iOS 7 – Невозможно выровнять правое подзону справа от UIScrollView

    UIView Swipe Animation Glitches

    Как сообщить Xcode, как включить библиотеку, указанную с помощью угловых скобок?

    UIModalTransitionStyleFlipГоризонтальные переходы по вертикали в ландшафте

    рендеринг приложений OpenGL в фоновом режиме

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.