2016-10-06 4 views
5

Там, кажется, чтобы быть (ложь) память ошибки утечки в Xcode 8 при использовании с прошивкой 10 & Swift 3.Swift 3 & IOS, 10 ложная память ошибка утечки

Следующий код сообщает об утечке памяти в документах, а также Xcode отладчик 8 памяти:

class SomeClass: NSObject { 
    var view: SomeView! 

    deinit { 
     print("SomeClass deinit") 
    } 
} 

class SomeView: UIView { 
    weak var reference: SomeClass? 

    deinit { 
     print("SomeView deinit") 
    } 
} 

class ViewController: UIViewController { 
    var someProperty: SomeClass? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let c = SomeClass() 
     let v = SomeView() 
     c.view = v 
     v.reference = c 

     someProperty = c 
    } 
} 

ответ

3

Я пробовал различные варианты, чтобы подтвердить, что это действительно ошибка, и мои выводы:

  1. Когда вы не назначите c в образце со de до someProperty, оба экземпляра будут печатать строку в соответствующем deinit s. Истинный сильный справочный цикл не будет деинизировать.
  2. Когда SomeClass не наследуется от NSObject, эта ошибка не возникает.
  3. При использовании Swift 2.2 этого не происходит.
  4. При использовании iOS 9- этого не происходит.
  5. Адрес someProperty Установлен в nil где-то в коде, оба экземпляра: deinit ред. Отладчик памяти Xcode 8 подтверждает отсутствие утечек памяти. Однако в Инструментах это изменение не отражается - по праву, так как реальная утечка памяти, вероятно, не будет решена.

FYI, это происходит не только тогда, когда оно присваивается свойству UIViewController. Первоначально я узнал об этом поведении в одном объекте.

0

Кажется, исправлено iOS 10.3 (первая бета-версия) и Xcode 8.3 (первая бета-версия).

Смежные вопросы