2017-03-27 8 views
0

私はrootVC "VC1"で私のアプリケーション内にUINavigationControllerを持っています。VC1はすべてのセルの中に2imagesを持つcollectionviewを含んでいます。ユーザーがセルを選択すると、navigationcontrollerはセルから新しいvc "VC2"に画像を渡し、ナビゲーションコントローラーの上部にプッシュします。私の問題は、私はpopviewcontroller経由でVC2をダウンすると、VC2は正しく割り当てが解除されますが、メモリは同じ高レベルで維持されます(新しいvcをプッシュした後、60mbから130mbに増加します)。私は設定されたイメージを無用にしようとしていますが、イメージビューもありますが、この作品はありません。ここに私のコードの一部です:UINavigationControllerを解放した後にメモリが高いままになる

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)されるなど...この問題の原因は何ですか?私は間違って何をしていますか? btw。私はそれほど重要ではない機能やバールを省略しました

答えて

0

あなたはメモリリークがあります。私はいつも信じています あなたは新しいコントローラを介して新しいビューをプッシュします。これは新しいビューを作成します。つまり、ビューは完全に新しいものであり、再利用されません。あなたがプッシュしたビュー内に強い参照を持っている場合は、プッシュしたことを強く参照しているので除外しない限り解放されません。あなたはそれらの項目を除外して言った。 leftPhotoImageViewとrightPhotoImageViewを弱いプロパティとしてマークしてみましたか?何かがそのようなイメージを保持しているように見えます。

imageview.imageプロパティをnilに設定する代わりに、deinitをleftPhotoImageview = nilおよびrightPhotoImageView = nilに変更することもできます。

+0

毎回飛び出る後に減少しているときイムキャスティングimageviewを弱くしているか、または所有していないクラッシュがあり、破損した行がviewdidloadの 'view、addSubview(leftPhotoImageview!)'内にあるので、VC2のimageviewを割り当てても画像ビューがnilでないように見える場合、しかし、initでdeinitを使わないと、どうしてそれが起こっているのか分かりませんか?または任意の手がかり?私は私がここで終わった理由をすべて試したと思う以外にも:( –

0

OK]をクリックして、私はこれをしようとしなかった理由を知らない、私は解決策を見つけたと思うので、私は怠け者としての私のImageViewのをマークし、今メモリはVC

関連する問題