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")
}
}
どのように漏れがあると判断していますか?おそらくあなたの方法が間違っているか、これはコンパイラのバグではありません。 – Alistra
両方の計測器とメモリグラフがこれを示しています。これはリークです。 – Alan
脆弱でも未所有でもない強い参照を保持しません。だから、それは漏れの理由にはならない。参照してください:http://stackoverflow.com/a/26025176/6595536 – ObjectAlchemist