2017-07-13 12 views
1

すべてのビューコントローラのサブクラスとして使用するためにBaseViewControllerを作成しました。これは、遅延性のある変数を表示および非表示にする必要があるときに警告を表示できます。BaseViewControllerのサブクラスは即座にリリースされません3

今まではすべてがクールです。しかし、私は、これを継承しているすべてのビューコントローラが解放されていないことを理解しました。何が問題ですか?

class BaseViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = UIColor(red: 0.4/255.0, green: 100/215.0, blue: 120/255.0, alpha: 1.0) 
    } 

    override var preferredStatusBarStyle: UIStatusBarStyle { 
     return preferredStatusBarStyle_Internal() 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return supportedInterfaceOrientations_Internal() 
    } 

    lazy var progressHUD: MBProgressHUD = { 
       if let navController = self.navigationController { 
        return navController.HUD 
       } 
     return self.HUD 
    }() 

    func showAlert(_ title: String?, message: String) { 

     let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 
     let action = UIAlertAction(title: "OK", style: .cancel, handler: { _ in 
      DispatchQueue.main.async { 
       self.progressHUD.hide(animated: false, afterDelay: 1.0) 
      } 
     }) 

     alert.addAction(action) 
     present(alert, animated: true, completion: nil) 
    } 

    func showPermissionDeniedAlert(_ message: String) { 
     let alertController = UIAlertController(title: message, message: "Go to Settings?".localized, preferredStyle: .alert) 
     let settingsAction = UIAlertAction(title: "Settings".localized, style: .default) { _ in 
      guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else { 
       return 
      } 
      if UIApplication.shared.canOpenURL(settingsUrl) { 
       if #available(iOS 10.0, *) { 
        UIApplication.shared.open(settingsUrl, completionHandler: { success in 
         print("Settings opened: \(success)") // Prints true 
        }) 
       } else { 
        let success = UIApplication.shared.openURL(settingsUrl) 
        print("Settings opened: \(success)") 
       } 
      } 
     } 
     alertController.addAction(settingsAction) 
     let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil) 
     alertController.addAction(cancelAction) 

     present(alertController, animated: true, completion: nil) 
    } 
} 

extension UIViewController { 
    func preferredStatusBarStyle_Internal() -> UIStatusBarStyle { 
     return .lightContent 
    } 

    func supportedInterfaceOrientations_Internal() -> UIInterfaceOrientationMask { 
     return isiPad() ? .allButUpsideDown : .all 
    } 

    var HUD: MBProgressHUD { 
     let progressHUD = MBProgressHUD(viewController: self) 
     return progressHUD 
    } 
} 

答えて

0

ビューコントローラがリリースされていない場合は、保持サイクルを作成していることを意味します。

これは、非同期ブロックに2ヶ所

  1. パスweakselfである可能性があります。
DispatchQueue.main.async { [weak self] in 
self?.progressHUD.hide(animated: false, afterDelay: 1.0) 
} 
MBProgressHUD INITがサイクル
var HUD: MBProgressHUD { 
// you can also use weak self 
unowned let unownedSelf = self 

let progressHUD = MBProgressHUD(viewController: unownedSelf) 
return progressHUD 
} 
を保持作成された場合、弱参照を渡し
  • 関連する問題