Ank*_*ush 1 memory-leaks uitableview ios swift uitableviewrowaction
我正在开发一个具有与“ Instagram”中相同的UI的应用程序。我有一个供稿墙,用户可以在其中滚动并查看朋友添加的新图片,类似于instagram。每个UITableViewcell都有一张图片和它自己的节Header视图。我已经通过为每个单元格创建部分来实现这一点。但我担心内存泄漏
这是我的代码
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 45))
headerView.tag = 101
let imageView :UIImageView = UIImageView(frame: UtilityManager.setFrameWithOutHeight(CGRectMake(22, 5 , 30, 30)))
imageView.backgroundColor = UIColor.blueColor()
imageView.tag = 101
imageView.layer.cornerRadius = 15.0
imageView.clipsToBounds = true
imageView.layer.borderWidth = 1
imageView.layer.borderColor = UIColor.grayColor().CGColor
headerView.addSubview(imageView)
var label = UILabel(frame: UtilityManager.setFrameWithOutHeight(CGRectMake(50, 5, 320 - 60 , 35)))
label.textAlignment = NSTextAlignment.Left
label.backgroundColor = UIColor.clearColor()
label.textColor = UIColor(red: 1, green: 0.28, blue: 0.27, alpha: 1)
label.text = "I'am a test label"
label.font = UIFont(name: Constants.FONT_MEDIUM, size: 12)
headerView.addSubview(imageView)
headerView.backgroundColor = UIColor.clearColor()
return headerView
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我正在使用Swift。它是如此酷吗;)。让我解释一下有关此委托函数的更多信息,以创建自定义部分的标题。每当我的单元格或部分中的任何一个出现在屏幕上时,即使我滚动回到已经分配了headerView的部分,也会调用此委托方法。因此,在滚动时为一个节多次创建headerView。但是我知道这是错误的方法,必须有一些检查天气headerView是否已创建的方法。如果我的视图确实存在于内存中,有什么方法可以检查代码,那么就无需再次分配内存了。有人请帮助:)。我什至会得到一点帮助。
通常,您需要与Cocoa为表单元提供的相同的内存管理和单元重用模式,因此请使用UITableViewHeaderFooterView。在viewDidLoad:通话tableView.registerClass(UITableViewHeaderFooterView.classForCoder(), forHeaderFooterReuseIdentifier:"Header")
现在,您可以在委托方法中按需出列这些视图,例如:
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView: UITableViewHeaderFooterView
if let reusedView = tableView.dequeueReusableHeaderFooterViewWithIdentifier("Header") as? UITableViewHeaderFooterView {
// Remove the existing contents of the reused view
map(reusedView.contentView.subviews) {
$0.removeFromSuperview()
}
headerView = reusedView
} else {
headerView = UITableViewHeaderFooterView(reuseIdentifier:"Header")
}
let imageView = ... // Set up image view
let label = ... // Set up label
headerView.contentView.addSubview(imageView)
headerView.contentView.addSubview(label)
return headerView
}
Run Code Online (Sandbox Code Playgroud)
现在,Cocoa可以根据需要处理和重用这些标题视图。
如果您子类化UITableViewHeaderFooterView并添加了图像和标签属性,则此实现会更加简单(这样,您就不必删除子视图,然后将其添加到出列视图中,只需用名称替换它们即可)。同样,如果您为课程设计一个笔尖或通过情节提要使用表视图单元格作为视图,则出队将永远不会返回nil。
既然您提到您可能有“无限个单元”,那么也许您担心将太多的数据源保存在内存中(也许对于这些图像视图,您有大量的大图像)。在这种情况下,您需要设置某种缓存。看一看NSCache是否达到这一点。无需实现自己的缓存。
应OP的要求,我将详细介绍此出队系统在Cocoa中的工作方式。您可能在您的代码中有类似的代码tableView:cellForRowAtIndexPath:委托方法。假设您的用户在您的表格视图中向下滚动。您的表格视图顶部的单元格和标题不显示在屏幕上,新的单元格和标题显示在表格视图的底部。所有这些单元格都具有相似的格式。现在假设可可没有做任何特别的事情(没有单元格的队列)。消失的单元将被释放,而出现的单元将被重新创建。取而代之的是,可可尝试提高效率,并将这些单元格/标题保留在队列中。它所创建的内容不会超出任何一次在屏幕上显示所需的内容。当其中一个单元格脱离屏幕时,它将其放入队列中,然后该单元格可供稍后由您出队(从队列中取出)。当您将单元格或标头出队时(根据其重用标识符字符串要求它),它将为您提供离开屏幕(或其中之一)的确切视图。一旦获得它,就可以根据需要对其进行配置。是的,在上面的代码中,您仍然必须创建UIImageView和UILabel(我将在下面说明如何并且应该做得更好),但是UIView不需要更改的主要视图和任何类型的装饰视图仍将存在(重用它们不会产生计算成本)。因此,基本上,可可可帮助您回收这些视图,从而使事情变得非常高效和安全。
您会注意到,当上面的代码尝试使一个单元出队时,它位于一条if let测试它是否为nil 的语句中。这很重要,因为如果您只是加载表格视图,则队列中没有任何单元格/视图可以提供给您,因此,如果它为零,那么您将从头实例化一个新视图。实例化它时,给它一个重用标识符字符串。如果此视图稍后出现在屏幕外,则可可知道会将其放入其特殊队列中,以便稍后返回给您。但是,如上所述,如果您的视图是从笔尖或情节提要中加载的,则出队总是返回非零。关于从笔尖加载的最后一个细节,您需要使用的registerNib:forHeaderFooterReuseIdentifer:方法注册重用标识符UITableView。
现在您可以看到Cocoa如何有效地处理这些单元格/视图,方法是在用户滚动表视图时不要求您实例化新视图,您可能会对我上面的代码有些失望,因为您仍然删除了所有旧的子视图并实例化new UIImageView和UILabels,的确会让您失望。推荐的解决方法是通过子类化UITableViewHeaderFooterView,或者您也可以将任何子类真正子类化UIView。为imageView和label创建一个属性。现在,不要破坏具有旧内容的子视图,然后再次创建这些视图,而只需将它们的内容替换为新的适当内容(imageView.image = newUIImage和label.text = newString)。信不信由你,这将节省大量计算。 UIView创建起来有些昂贵。一个草率的(尽管可能更灵活)替代子类化的方法是,使用tag属性将标签放在要插入的这些视图上,然后使用引用这些视图headerView.viewWithTag(anInt)。
而且,我讨厌所有关于标题的讨论都是徒劳的,但是我将作最后的观察。我注意到您说每个单元格都有自己的标题。如果是这样,那么只制作一个大表单元格(将标头内容放在普通表视图单元格内容上方)可能会更好。您可以一起跳过标题。但是,我不知道您的应用程序中正在发生的所有事情,因此,我只允许您对此做出判断。
祝你好运@Ankush!了解绳索UITableView是一项出色的iOS技能,我相信您将来会发现它有用!
| 归档时间: |
|
| 查看次数: |
1665 次 |
| 最近记录: |