簡體   English   中英

如何釋放UIImageView的內存(Swift)

[英]How to release memory for UIImageView (Swift)

我遇到了UIImage問題。 我已經手動將UIImageView對象添加到滾動視圖。 問題是:當我有超過50張圖像時,內存將增加到200MB左右,並且該應用程序將在iPhone 4或4s上崩潰。 我想為收到內存警告以防止崩潰的不可見部分圖像釋放內存,但我不知道如何使用Swift釋放它們。 請幫幫我。

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

    // Dispose of any resources that can be recreated.
}

func loadImage(index:Int){
if self.imgPaths.count == 0 {
    println("Has not data")
    actInd.stopAnimating()
    return
}
var imgURL: NSURL = NSURL(string: self.imgPaths[index].stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()))!
let width:CGFloat = self.view.bounds.width
let height:CGFloat = self.view.bounds.height
var view:UIView = UIView(frame: CGRectMake(0, 0, width, height));

if let imgObj = self.dicData[index] {

}
else
{
println("imgURL \(imgURL)")
let request: NSURLRequest = NSURLRequest(URL: imgURL)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
    if error == nil {
        let imgItem = UIImage(data: data)!

        var te :Float = self.imgPaths.count > 0 ? Float(index  + 1) / Float(self.imgPaths.count) : 1
        self.progressView.setProgress(te, animated: true)

        if let imgObj = self.dicData[index] {

            if index < self.imgPaths.count - 1
            {
                var nextIndex:Int = index + 1
                self.loadImage(nextIndex)
            }
            if(index == self.imgPaths.count - 1)
            {
                if self.currentImageIndex > 0
                {
                    self.isAddedFirstImg = true
                }
                if !self.isAddedFirstImg
                {
                    self.scrollViews[0].zoomScale = self.zoomScales[0]
                    self.view.insertSubview(self.scrollViews[0], belowSubview: self.tabBar.viewWithTag(77)!)
                    self.isAddedFirstImg = true
                }

                self.actInd.stopAnimating()
                println("loaded image")
            }
        }
        else
        {
            self.dicData[index] = UIImageView(image: imgItem)

            self.dicData[index]?.frame = CGRect(origin: CGPointMake(0.0, 0.0), size:imgItem.size)

            // 2
            self.scrollViews[index].addSubview(self.dicData[index]!)
            self.scrollViews[index].contentSize = imgItem.size

            // 3
            var doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewDoubleTapped:")
            doubleTapRecognizer.numberOfTapsRequired = 2
            doubleTapRecognizer.numberOfTouchesRequired = 1
            self.scrollViews[index].addGestureRecognizer(doubleTapRecognizer)

            var singleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewSingleTapped:")
            singleTapRecognizer.numberOfTapsRequired = 1
            singleTapRecognizer.numberOfTouchesRequired = 1
            self.scrollViews[index].addGestureRecognizer(singleTapRecognizer)

            var swipeRight = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
            swipeRight.direction = UISwipeGestureRecognizerDirection.Right
            self.scrollViews[index].addGestureRecognizer(swipeRight)

            var swipeLeft = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
            swipeLeft.direction = UISwipeGestureRecognizerDirection.Left
            self.scrollViews[index].addGestureRecognizer(swipeLeft)

            // 4
            var scrollViewFrame = self.scrollViews[index].frame
            var scaleWidth = scrollViewFrame.size.width / self.scrollViews[index].contentSize.width
            var scaleHeight = scrollViewFrame.size.height / self.scrollViews[index].contentSize.height
            var minScale = min(scaleWidth, scaleHeight)
            self.zoomScales[index] = minScale
            self.scrollViews[index].minimumZoomScale = minScale

            // 5
            self.scrollViews[index].maximumZoomScale = 1.0
            self.scrollViews[index].delegate = self

            // 6
            self.centerScrollViewContents(index)

            dispatch_async(dispatch_get_main_queue(), {
                println("downloaded image index: \(index) CH.\(self.chapterID)")
                if(index == 0)
                {
                    self.scrollViews[0].zoomScale = self.zoomScales[0]
                    self.view.insertSubview(self.scrollViews[0], belowSubview: self.tabBar.viewWithTag(77)!)
                    self.actInd.stopAnimating()
                }

                if index < self.imgPaths.count - 1 && !self.stopDownload
                {
                    var nextIndex:Int = index + 1
                    self.loadImage(nextIndex)
                }
                if(index == self.imgPaths.count - 1)
                {
                    if self.currentImageIndex > 0
                    {
                        self.isAddedFirstImg = true
                    }
                    if !self.isAddedFirstImg
                    {
                        self.scrollViews[0].zoomScale = self.zoomScales[0]
                        self.view.insertSubview(self.scrollViews[0], belowSubview: self.tabBar.viewWithTag(77)!)
                        self.isAddedFirstImg = true
                    }

                    self.actInd.stopAnimating()
                    println("loaded image")
                }
            })
        }
    }
    else {
        println("Error: \(error.localizedDescription)")
    }
})
}

}

Swift使用ARC(自動引用計數)來管理內存。 要從內存中釋放某些內容,必須刪除對該對象的所有引用。 ARC會維護一個保存對對象的引用的位置數,當該計數達到0時,將釋放內存。

在您的情況下,您的self.dicData[index]存儲在self.dicData[index]並將它們作為self.scrollViews[index]子視圖添加。 您將需要從其self.dicData視圖和self.dicData刪除self.dicData 完成后,內存將被釋放。

如果您有要釋放的imageView的index ,請執行以下操作:

self.dicData[index]?.removeFromSuperview()
self.dicData[index] = nil

快速有一個非常好的工具叫做“ lazy”,您可能想研究lazy var,當它涉及到圖像和表格視圖時(對於您的實例collectionview),它非常方便

您將從自定義單元格中使用它時會看到巨大的差異。 創建一個imageview,例如lazy var imageViewer:UIImageView我的應用程序大約在150mb 200mb的內存上,現在它在40〜60mb嘗試一下!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM