我使用下面的代码从服务器下载图像。此代码是在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 +并且滚动它会增加。
我无法理解我该做什么或错过了什么。任何人都可以帮助我理解并解决这个问题。
答案 0 :(得分:0)
unowned
和weak
。此闭包不会创建参考周期。
显然,当您使用unowned
时,您会获得_swift_abortRetainUnowned
因为self
变为nil
。
由于目标是使用下载的图像更新单元格,self
(单元格)应该保持活动状态。因此,应该使用强烈的自我提法。关闭一旦完成,self
将被解除。