2017-04-14 3 views
3

メモリ管理に関する問題が発生しています。私はUIViewControllerのサブクラスを持っており、リファレンスをviewControllerに戻すために手動でビューを設定し、参照サイクルを避けるためにweak/unownedを使用します。 問題は、私がunownedを使用するとメモリリークが発生しますが、weakを使用した場合、私にはメモリリークはありません。なぜこれが起こるのか分かりません。未登録のリファレンスがリークする、弱いが発生しない

更新: これはバグのようです。

コンソール出力:

removing vc 
view Controller deinitialized 
custom view deinitialized 

私は8.3.1

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    window = UIWindow(frame: UIScreen.main.bounds) 
    window?.rootViewController = ViewController(nibName: nil, bundle: nil) 
    window?.makeKeyAndVisible() 

    DispatchQueue.main.asyncAfter(deadline: .now() + 5) { 
     print("removing vc") 
     self.window?.rootViewController = nil 
    } 

    return true 
} 


class ViewController: UIViewController { 

    override func loadView() { 
     view = CustomView(frame: .zero, vc: self) 
     view.backgroundColor = .red 
    } 

    deinit { 
     print("view Controller deinitialized") 
    } 
} 

class CustomView:UIView{ 

    init(frame: CGRect , vc:ViewController) { 
     self.vc = vc 
     super.init(frame: frame) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    // weak var vc : ViewController! // no leak 
    unowned var vc : ViewController // leak 

    deinit { 
     print("custom view deinitialized") 
    } 
} 
+1

どのように漏れがあると判断していますか?おそらくあなたの方法が間違っているか、これはコンパイラのバグではありません。 – Alistra

+0

両方の計測器とメモリグラフがこれを示しています。これはリークです。 – Alan

+0

脆弱でも未所有でもない強い参照を保持しません。だから、それは漏れの理由にはならない。参照してください:http://stackoverflow.com/a/26025176/6595536 – ObjectAlchemist

答えて

2

のXcodeを使用しているのXcode 8.2リリースノート:

のMacOSとiOSシミュレータの修正のためのメモリデバッガを 列挙型のいずれかのフィールドを含むSwiftクラスのfalseメモリリークの報告、特定のObjective-Cフレームワーク クラスを継承したクラスです。 (27932061)

関連する問題