2017-02-28 27 views
2

我正在運行的儀器來檢查內存泄漏,當綁定這個可觀察到的UIButton標題時,我看到內存泄漏。任何想法我做錯了什麼或我該如何解決這個問題?RxSwift綁定數據到UIButton內存泄漏

override func viewDidLoad() { 
... 
viewModel?.menuData.asObservable().subscribe(onNext: setupTopMenu).addDisposableTo(disposeBag) 
... 
} 

func setupTopMenu(items: [MenuItemViewModel]) { 
     topMenuStackView.subviews.forEach({ $0.removeFromSuperview() }) 
     for (i, item) in items.enumerated() { 
      let button = UIButton(type: .custom) 
      item.titleUppercased.bindTo(button.rx.title(for: .normal)).addDisposableTo(disposeBag) // memory leak 

      topMenuStackView.addArrangedSubview(button) 
     } 
} 

Instruments screenshot

回答

1

你想寫你申購代碼像這樣

viewModel?.menuData.asObservable().subscribe(onNext: { [unowned self] in 
    self.setupTopMenu($0) 
}).addDisposableTo(disposeBag) 

這是因爲使用經過語法功能時,self被隱式保留。不幸的是沒有辦法解決這個問題。

+0

您確定嗎?如果封閉不屬於班級,我認爲你不必使用[弱/無主] – DAN

+0

但在這個特殊的例子中,它看起來像'setupTopMenu'是視圖控制器的成員。 – tomahh