繁体   English   中英

Swift闭包变量导致内存泄漏

[英]Swift closure with variable causing memory leak

我正在调试我的程序存在内存泄漏问题。 在ViewController中,当它弹出时,应该调用deinit函数。 但它没有,所以我尝试通过以下步骤弄明白。

通过评论许多行,我发现以下行使ViewController没有dealloc。

var api:APIGetList = APIGetList(tripId: trip.id, offsetToken: offsetToken,shouldRemoveAll:self.shouldRemoveAll)
api.request({ (obj, error) -> Void in
    //ingore here
    }, immediateHandler: {[unowned self](obj) -> Void in
        if var tripPosts = obj as? [TripPost]{
            self.tripPosts = tripPosts<--- this line cause the leak
        }
        self.tableView.reloadData()

    }, failHandler: { (errCode, errMsg, error) -> Void in
        self.isLoading = false
        self.refreshControl.endRefreshing()
})

在我的ViewController中,我将调用api来获取数据,并替换当前的tripPosts列表。 我提到的这条线“这条线引起了泄漏”,当我评论它时,deinit叫。 所以我认为这条线是导致问题的原因。

对于回叫对象 - 对象。 它来自以下代码:

var tripPosts = [TripPost]()
tripPosts = TripPost.MR_findAll()
immediateHandler(obj: tripPosts)

是什么导致内存泄漏?

在api.request之后不久尝试[弱自我]({in

  var api:APIGetList = APIGetList(tripId: trip.id, offsetToken: offsetToken,shouldRemoveAll:self.shouldRemoveAll)

        api.request({ [weak self](obj, error) -> Void in
            //ingore here
            }, immediateHandler: {[weak self](obj) -> Void in
                if var tripPosts = obj as? [TripPost]{
                    self.tripPosts = tripPosts<--- this line cause the leak
                }
                self.tableView.reloadData()

            }, failHandler: {[weak self] (errCode, errMsg, error) -> Void in
                self.isLoading = false
                self.refreshControl.endRefreshing()
        })

哦......终于我明白了。 问题是行self.tableView.reloadData()< - 并且在cellForTableView中我将一个委托分配给不是弱引用的单元格...

所以这与封闭无关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM