解除分配UINavigationController后内存保持高位

时间:2017-03-27 17:44:41

标签: ios swift memory-leaks uinavigationcontroller uiimage

我在我的应用程序中使用rootVC" VC1"获得了UINavigationController,VC1在每个单元格内部包含2images的集合视图。当用户选择单元格时,navigationcontroller会将图像从单元格传递到新的vc" VC2"然后将其推送到navigationcontroller的顶部。我的问题是当我通过popviewcontroller取消VC2时,VC2被正确释放,但内存保持在相同的更高级别(推送新的vc后,它从60mb增加到130mb)。我尝试将图像设置为nil,而imageview也没有尝试。这是我的一些代码:

class VC1: UIViewController {
 var selectedUserPollDetails : VC2?

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! AppUserCell

    selectedUserPollDetails = VC2()

    selectedUserPollDetails?.leftPhoto = cell.leftImageNode.image
        selectedUserPollDetails?.rightPhoto = cell.rightImageNode.image
        navigationController?.pushViewController(selectedUserPollDetails !, animated: true)
}
}

class VC2: UIViewController {

lazy var arrow : ArrowBack = {
    let arrow = ArrowBack()
    return arrow
}()

weak var leftPhoto: UIImage?
weak var rightPhoto: UIImage?

 var leftPhotoImageview: UIImageView = {
    let imageview = UIImageView()
    imageview.contentMode = .scaleAspectFill
    imageview.layer.cornerRadius = 5
    imageview.layer.masksToBounds = true
    return imageview
}()

 var rightPhotoImageview: UIImageView = {
    let imageview = UIImageView()
    imageview.contentMode = .scaleAspectFit
    imageview.layer.cornerRadius = 5
    imageview.clipsToBounds = true
    return imageview
}()

override func viewDidLoad() {
    super.viewDidLoad()
view.addSubview(leftPhotoImageview)
    view.addSubview(rightPhotoImageview)
  view.addSubview(arrow)
    arrow.addTarget(self, action: #selector(handleArrowBack), for: .touchUpInside)

}

func handleArrowBack(){
    navigationController?.popViewController(animated: true)
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    leftPhotoImageview.frame = CGRect(x: 100, y: 0, width: 100, height: 100)
    rightPhotoImageview.frame = CGRect(x: 100, y: 200, width: 100, height: 100)

    if leftPhoto != nil, rightPhoto != nil{
        leftPhotoImageview.image = leftPhoto
        rightPhotoImageview.image = rightPhoto
    }
}

deinit{
    leftPhoto = nil
    rightPhoto = nil
    leftPhotoImageview.image = nil
    rightPhotoImageview.image = nil
}

我甚至在最后添加了deinit以确保照片被解除分配。所以基本上当我试图再次推送VC2时(弹出后)内存量再次翻倍(260mb)等等......导致这个问题的原因是什么?我究竟做错了什么? 顺便说一句。我已经省略了不太重要的功能和变量

2 个答案:

答案 0 :(得分:0)

你的defo有内存泄漏。我相信每一次 你通过导航控制器推送一个新的视图,它创建一个全新的视图,即视图是全新的,不会被重用。如果您在视图中有强烈的引用,那么它们将不会被释放,除非你因为他们有强烈的参考来查看你已经推动所以他们徘徊不去。你提到你放弃那些物品。您是否也尝试将leftPhotoImageView和rightPhotoImageView标记为弱属性?有些东西会抓住它看起来的那些图像。

您还可以将deinit更改为leftPhotoImageview = nil和rightPhotoImageView = nil,而不是将imageview.image属性设置为nil(如果这是有意义的。)

答案 1 :(得分:0)

好吧,我想我找到了一个解决方案,我不知道为什么我没有尝试这个,所以我将我的imageview标记为懒惰,现在内存在弹出vc之后正在减少