Swift 保留在内存中的自定义UIView
在VC中尝试将自定义UIView添加为tableView页脚时,我遇到了一个恼人的内存问题。以下是我的工作:Swift 保留在内存中的自定义UIView,swift,memory-management,Swift,Memory Management,在VC中尝试将自定义UIView添加为tableView页脚时,我遇到了一个恼人的内存问题。以下是我的工作: 我声明了一个名为tableViewHeader的自定义UIView类。我的页脚应该显示一个徽标和一些文本,因此它有两个全局变量(一个UIImage视图和一个TextView)和一个初始化UIView类的init方法(即,通过添加两个子视图并设置一些约束) 在我的VC中,在TableView的footerForSection方法中,我声明了一个新的tableViewFooter变量,设置
- 我声明了一个名为tableViewHeader的自定义UIView类。我的页脚应该显示一个徽标和一些文本,因此它有两个全局变量(一个UIImage视图和一个TextView)和一个初始化UIView类的init方法(即,通过添加两个子视图并设置一些约束)李>
- 在我的VC中,在TableView的footerForSection方法中,我声明了一个新的tableViewFooter变量,设置子视图(附加我的PNG等) 并返回该视图
- 如果不添加footerView和打开/关闭VC,则不会显示20MB跳转,因此我相当确定这是由此自定义tableViewHeader引起的李>
- 我还检查了从我的资产加载的UIImage是否太大,但它只有200Kb。最重要的问题是,在我的VC被释放后,内存没有被释放
- 我已经尝试声明了我的变量(tableViewFooter变量和新类中的子视图),但是当我尝试将变量添加为子视图时,会将它们保留为nil
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(并实例化多个对象)。。。