自我被关闭所捕获

时间:2016-03-14 06:42:52

标签: ios swift memory-management memory-leaks closures

我使用下面的代码从服务器下载图像。此代码是在UserCell类下编写的,该类是UITableViewCell的子类。

class UserCell: UITableViewCell {
    @IBOutlet weak var profileImage: UIImageView!

    override func awakeFromNib() {
        super.awakeFromNib()
        //calling related methods
    }

    /*
    * Other stuffs *
    */

   func refreshImage(fileURL: NSURL?) {
        unowned let unownedSelf = self
        DownloadManager.download(fileURL: imageURL!, completion: {(filePath) -> (Void) in
           dispatch_async(dispatch_get_main_queue(), { () -> Void in
           unownedSelf.profileImage.image = UIImage(contentsOfFile: filePath.path!)
           })
         }, error: { (error) -> (Void) in
            // Handle error        
       })
   }
}

UITableView数据源实现

class Friends: UIViewController {
    /*
    * Other stuffs *
    */

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let reusableIdentifier = "identifier"
        let userObject = arrUsers[indexPath.row] //arrUsers is my array of users
        let cell = tableView.dequeueReusableCellWithIdentifier(reusableIdentifier, forIndexPath: indexPath) as! UserCell
        cell.refreshImage(userObject.image)
        return cell
    }
}

但它因_swift_abortRetainUnowned错误而崩溃。为了防止崩溃,我使用了[weak self]self?.但现在问题是self没有被释放。

DownloadManager.download(fileURL: imageURL!, completion: { [weak self] (filePath) -> (Void) in
   dispatch_async(dispatch_get_main_queue(), { () -> Void in
       // culprit statement
       self?.profileImage.image = UIImage(contentsOfFile: filePath.path!)
      })
   }, error: { (error) -> (Void) in
        // Handle error        
})

如果我注释掉罪魁祸首声明,那么我的内存消耗大约是40Mb,但是这个声明它会变成200Mb +并且滚动它会增加。

我无法理解我该做什么或错过了什么。任何人都可以帮助我理解并解决这个问题。

1 个答案:

答案 0 :(得分:0)

在您的情况下,不应使用

unownedweak。此闭包不会创建参考周期。

显然,当您使用unowned时,您会获得_swift_abortRetainUnowned因为self变为nil

由于目标是使用下载的图像更新单元格,self(单元格)应该保持活动状态。因此,应该使用强烈的自我提法。关闭一旦完成,self将被解除。