Swift 保留在内存中的自定义UIView

Swift 保留在内存中的自定义UIView,swift,memory-management,Swift,Memory Management,在VC中尝试将自定义UIView添加为tableView页脚时,我遇到了一个恼人的内存问题。以下是我的工作: 我声明了一个名为tableViewHeader的自定义UIView类。我的页脚应该显示一个徽标和一些文本,因此它有两个全局变量(一个UIImage视图和一个TextView)和一个初始化UIView类的init方法(即,通过添加两个子视图并设置一些约束) 在我的VC中,在TableView的footerForSection方法中,我声明了一个新的tableViewFooter变量,设置

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

  • 我声明了一个名为tableViewHeader的自定义UIView类。我的页脚应该显示一个徽标和一些文本,因此它有两个全局变量(一个UIImage视图和一个TextView)和一个初始化UIView类的init方法(即,通过添加两个子视图并设置一些约束)
  • 在我的VC中,在TableView的footerForSection方法中,我声明了一个新的tableViewFooter变量,设置子视图(附加我的PNG等) 并返回该视图
代码可以很好地显示页脚,但会破坏我的内存——当我运行应用程序并打开包含该tableViewHeader的VC时,我的内存会跳跃约20MB(~20%跳跃),并且在释放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)
}
My 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
    }
}

困惑:头饰?ViewForFooterInstition?页眉还是页脚?还有,您有多少节?问题是每次tableview调用ViewForFooterInstition时,您都在分配一个新的MessageTableFooterView。根据您的用例,您有几个选项。如果您有一个静态表,您可以在类中创建和管理这些对象的实例。如果根据tableview内容需要动态页脚数,请尝试并注意,在ViewForFooterInstitution中,每次都为文本创建一个新的UIImage和字符串,如果每条消息不需要这样做,则应在类中缓存它们。“如果不添加headerView和打开/关闭VC,则不会显示20MB跳转,因此我相当确定这是由此自定义tableViewHeader引起的。。。“然而,你发布的所有代码都是关于页脚的?谢谢大家-很好的捕获重新提到页脚和页眉。我现在编辑了我的文章,以一致地引用页脚。另外,我有一个静态数据源,每个tableview只有一个页脚(仅一个部分),所以我认为问题不在于tableview多次调用ViewForFooterInstition(并实例化多个对象)。。。