2017-02-22 5 views
0

Я создаю пользовательский TabBarController и добавляю несколько кнопок с изображениями на них. Но я обнаружил, что каждый раз, когда я загружаю TabBarController, ничего не делая и немедленно его увольняю, память постоянно увеличивается. Я не мог найти никаких проблем в моем коде. Пожалуйста помоги. Заранее спасибо!Swift TabBarController не правильно освобождает?

class CustomTabBarController: UITabBarController { 

    var menuButton: UIButton! 
    var announcementButton : UIButton! 
    var broadcastButton: UIButton! 
    var toDoListButton: UIButton! 
    var plusMenuBool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let newInfo = UIImage(named: "info")!.imageResize(sizeChange: CGSize(width: 30, height: 30)) 
     self.viewControllers![0].tabBarItem.image = newInfo 

     let newChat = UIImage(named: "chat")!.imageResize(sizeChange: CGSize(width: 30, height: 30)) 
     self.viewControllers![1].tabBarItem.image = newChat 

     self.setupMiddleButton() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func setupMiddleButton() { 
     // menuButton 
     menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64)) 
     var menuButtonFrame = menuButton.frame 
     menuButtonFrame.origin.y = self.view.bounds.height - menuButtonFrame.height 
     menuButtonFrame.origin.x = self.view.bounds.width/2 - menuButtonFrame.size.width/2 
     menuButton.frame = menuButtonFrame 

     // announcementButton 
     announcementButton = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) 
     var announcementButtonFrame = announcementButton.frame 
     announcementButtonFrame.origin.y = self.view.bounds.height - announcementButtonFrame.height 
     announcementButtonFrame.origin.x = self.view.bounds.width/2 - announcementButtonFrame.size.width/2 
     announcementButton.frame = announcementButtonFrame 

     self.announcementButton.layer.anchorPoint = CGPoint(x: 0.5, y: 3.5) 
     announcementButton.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI*3/4)) 

     // broadcastButton 
     broadcastButton = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) 
     var broadcastButtonFrame = broadcastButton.frame 
     broadcastButtonFrame.origin.y = self.view.bounds.height - broadcastButtonFrame.height 
     broadcastButtonFrame.origin.x = self.view.bounds.width/2 - broadcastButtonFrame.size.width/2 
     broadcastButton.frame = broadcastButtonFrame 

     self.broadcastButton.layer.anchorPoint = CGPoint(x: 0.5, y: 3.5) 
     broadcastButton.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI)) 

     // toDoListButton 
     toDoListButton = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) 
     var toDoListButtonFrame = toDoListButton.frame 
     toDoListButtonFrame.origin.y = self.view.bounds.height - toDoListButtonFrame.height 
     toDoListButtonFrame.origin.x = self.view.bounds.width/2 - toDoListButtonFrame.size.width/2 
     toDoListButton.frame = toDoListButtonFrame 

     self.toDoListButton.layer.anchorPoint = CGPoint(x: 0.5, y: 3.5) 
     toDoListButton.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI+M_PI/4)) 

     // addSubView 
     menuButton.layer.cornerRadius = menuButtonFrame.height/2 
     announcementButton.layer.cornerRadius = announcementButtonFrame.height/2 
     broadcastButton.layer.cornerRadius = announcementButtonFrame.height/2 
     toDoListButton.layer.cornerRadius = announcementButtonFrame.height/2 
     self.view.addSubview(menuButton) 
     self.view.addSubview(announcementButton) 
     self.view.addSubview(broadcastButton) 
     self.view.addSubview(toDoListButton) 

     menuButton.setImage(UIImage(named: "plus"), for: UIControlState.normal) 
     menuButton.addTarget(self, action: #selector(self.menuButtonAction(sender:)), for: UIControlEvents.touchUpInside) 
     announcementButton.setImage(UIImage(named: "announcement"), for: .normal) 
     announcementButton.addTarget(self, action: #selector(self.announcementButtonAction(sender:)), for: UIControlEvents.touchUpInside) 
     broadcastButton.setImage(UIImage(named: "broadcast"), for: .normal) 
     broadcastButton.addTarget(self, action: #selector(self.broadcastButtonAction(sender:)), for: UIControlEvents.touchUpInside) 
     toDoListButton.setImage(UIImage(named: "toDoList"), for: .normal) 
     toDoListButton.addTarget(self, action: #selector(self.toDoListButtonAction(sender:)), for: UIControlEvents.touchUpInside) 

     self.view.layoutIfNeeded() 
    } 
} 

ответ

0

Я понял, что дочерний viewController у tabBarController имеет «сильную» ссылку на родительский tabBarController. После того как я изменил его на слабые, tabBarController освобождается правильно!

0

Отъезд memory management in swift.

Чтобы убедиться, что экземпляры не исчезли, пока они еще необходимы, ARC отслеживает, сколько свойств, констант и переменных в настоящее время ссылается на каждый экземпляр класса. ARC не освобождает экземпляр экземпляра, если по крайней мере одна активная ссылка на этот экземпляр все еще существует.

Короче вы можете сделать одно из перечисленных ниже действий:

  1. Проверьте, если TabBar становится освобождаться. Просто увольнение не гарантирует этого.
  2. Даже если tabBar освобожден, вы не увидите мгновенное уменьшение памяти.
  3. Проверьте, не связан ли какой-либо другой объект с tabBar. Это может привести к тому, что tabBar будет зависеть, поскольку ARC будет думать, что вам может понадобиться ссылка.
+0

У меня действительно есть ребенок, который крепко ссылается на него! Изменение его на слабые решает проблему. –

+0

Можете ли вы пометить мой ответ как правильный, если это решит вашу проблему? – SagarU

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