【发布时间】:2015-07-17 03:20:32
【问题描述】:
几天后我仍然无法找出为什么使用executeFetchRequest 会导致小的内存泄漏,显示在 Instruments: Leaks 中。我完全知道 UIKit 有很多漏洞,但我想至少尝试更好地理解它。
每当我执行 fetch 请求时,只要我不将它分配给类属性,它就不会泄漏。为了更好地解释这一点,我创建了一个新项目,如下所示:
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 秒后 Instruments 中会出现泄漏(请参见下面的屏幕截图)。
经过更多测试,创建outlet collection 也会导致轻微泄漏。找了几天,好像没有多少人遇到同样的问题。我想知道我做错了什么还是应该忽略这个?泄漏的大小并没有那么大(大约 100 字节)。
【问题讨论】:
-
我在分析内存泄漏时也注意到了这一点,并且对没有其他关于它的堆栈溢出帖子感到困惑。现在我决定单独添加所有 IBOutlets,然后有一个计算的 var 来返回一个插座的集合。至少这样泄漏不会出现在仪器中。
标签: swift core-data memory-leaks nsfetchrequest