几天之后,我仍然无法找到使用executeFetchRequest
导致内存泄漏的原因,显示在Instruments:Leaks中。我完全清楚UIKit有很多漏洞,但我想至少试着更好地理解它。
每当我执行获取请求时,只要我不将其分配给类属性,它就不会泄漏。为了更好地解释这一点,我创建了一个新项目,如下所示:
class TestViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
var persons = [Persons]()
override func viewDidLoad() {
super.viewDidLoad()
let request = NSFetchRequest(entityName: "Persons")
let results = context.executeFetchRequest(request, error: nil) as! [Persons]
persons = results //If I comment out this line, no leak will occur
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return persons.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel?.text = persons[indexPath.row].name
return cell
}
}
更改为此ViewController后,大约10秒后,仪器中会出现泄漏(见下面的屏幕截图)。
经过多次测试后,创建outlet collection
也会导致轻微泄漏。搜索了几天之后,似乎没有很多人遇到同样的问题。我想知道我做错了什么或者我应该忽略这个?泄漏的大小不是那么大(大约100字节)。
答案 0 :(得分:1)
关于出口收藏泄漏记忆的问题, 见this answer。
Joe Collins提到的解决方法是:
" ...替换[UIButton]!与NSArray!并在以后使用时将其内容转换为UIButton。"
答案 1 :(得分:0)
我认为泄漏是初始化的[Persons]
数组,它从未被使用但被fetch结果覆盖。取消分配视图控制器后,"泄露"记忆很可能会被回收。
根据我的理解,并且考虑到问题的范围,你可以放心地忽略这种现象。