自定义UIView保留在内存中

时间:2018-05-25 00:14:54

标签: swift memory-management

在尝试将其作为VCView中的tableView页脚添加时,我遇到了一个恼人的内存问题与自定义UIView。这是我的工作:

  • 我声明了一个名为tableViewHeader的自定义UIView类。我的页脚应该显示一个徽标和一些文本,因此它有2个全局变量(一个UIImage视图和一个TextView)和一个初始化这个UIView类的init方法(即通过添加两个子视图并设置一些约束)。
  • 在我的VC中,在TableView的footerForSection方法中,我声明了一个新的tableViewFooter变量,设置子视图(附上我的PNG等) 并返回该视图。

代码可以很好地显示页脚,但它破坏了我的内存 - 当我运行我的应用程序并打开包含该tableViewHeader的VC时,我的内存跳跃大约20MB(约20%的跳跃)并且没有#39;一旦我的VC被释放就会被释放(我检查过,VC本身被正确地解除了初始化但它没有显示任何内存下降)。

我测试了一些东西:

  • 如果不添加footerView并打开/关闭VC并不显示20MB跳转,所以我很确定这是由这个自定义tableViewHeader引起的......
  • 我还检查过以确保我从我的资产中加载的UIImage不是太大但它只有200Kb。最重要的是,问题更多的是我的VC发布后内存没有被释放...
  • 我尝试声明我的变量(tableViewFooter变量和新类中的子视图),但当我尝试将它们添加为子视图时,我的变量为nil ...

关于罪魁祸首是什么/如何解决它的想法已经不多了所以你能给我的任何帮助都会非常感激!

我的代码如下 - 提前感谢! 弗朗索瓦

我的TableFooterView类:

class MessageTableFooterView: UIView {

var shouldUpdateConstraints = true

var logoView: UIImageView!
var explanationTextView: UITextView!
var addFriendBtn: UIButton!

override init(frame: CGRect){
    super.init(frame: frame)

    logoView = UIImageView(frame: CGRect.zero)
    logoView?.autoSetDimension(.height, toSize: 145)
    logoView?.autoSetDimension(.width, toSize: 145)        
    self.addSubview(logoView)

    explanationTextView = UITextView(frame: CGRect.zero)
    explanationTextView?.isEditable = false
    explanationTextView?.isSelectable = false
    explanationTextView?.font = UIFont(name: "HelveticaNeue", size: 17)
    explanationTextView?.textColor = .darkGray
    explanationTextView?.textAlignment = .center

    self.addSubview(explanationTextView)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

我的tableView viewForFooter方法:

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    if MessageService.instance.savedMsgs.count > 0 {
        return nil
    } else {
        let headerView = MessageTableFooterView(frame: CGRect.zero)
        headerView.logoView.image = UIImage(named: "savedMessagesIcon")
        headerView.explanationTextView?.text = "Blablabla"
        return headerView
    }
}

0 个答案:

没有答案