使用CoreData或Outlet集合进行轻微泄漏

时间:2015-05-06 19:39:24

标签: swift core-data memory-leaks nsfetchrequest

几天之后,我仍然无法找到使用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秒后,仪器中会出现泄漏(见下面的屏幕截图)。

screenshot

经过多次测试后,创建outlet collection也会导致轻微泄漏。搜索了几天之后,似乎没有很多人遇到同样的问题。我想知道我做错了什么或者我应该忽略这个?泄漏的大小不是那么大(大约100字节)。

2 个答案:

答案 0 :(得分:1)

关于出口收藏泄漏记忆的问题, 见this answer

Joe Collins提到的解决方法是:

" ...替换[UIButton]!与NSArray!并在以后使用时将其内容转换为UIButton。"

答案 1 :(得分:0)

我认为泄漏是初始化的[Persons]数组,它从未被使用但被fetch结果覆盖。取消分配视图控制器后,"泄露"记忆很可能会被回收。

根据我的理解,并且考虑到问题的范围,你可以放心地忽略这种现象。