2017-09-06 48 views
0

我已閱讀有關該主題的多個主題,但我的問題仍然存在。 當我使用以下代碼調整圖像大小時:調整大小UIImage時發生內存泄漏

extension UIImage { 
    func thumbnailWithMaxSize(image:UIImage, maxSize: CGFloat) -> UIImage { 
    let width = image.size.width 
    let height = image.size.height 
    var sizeX: CGFloat = 0 
    var sizeY: CGFloat = 0 
    if width > height { 
     sizeX = maxSize 
     sizeY = maxSize * height/width 
    } 
    else { 
     sizeY = maxSize 
     sizeX = maxSize * width/height 
    } 

    UIGraphicsBeginImageContext(CGSize(width: sizeX, height: sizeY)) 
    let rect = CGRect(x: 0.0, y: 0.0, width: sizeX, height: sizeY) 
    UIGraphicsBeginImageContext(rect.size) 
    draw(in: rect) 
    let thumbnail = UIGraphicsGetImageFromCurrentImageContext()!; 

    UIGraphicsEndImageContext() 

    return thumbnail 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    let lionImage = UIImage(named: "lion.jpg")! 

    var thumb = UIImage() 

    autoreleasepool { 
     thumb = lionImage.thumbnailWithMaxSize(image: lionImage, maxSize: 2000) 
    } 
    myImageView.image = thumb 
} 

...內存未釋放。所以當我瀏覽多個ViewController時(例如使用PageViewController),我最終得到內存警告,最終應用程序崩潰。 我也嘗試通過UIImage(contentsOfFile:path)加載圖像,但沒有成功。 有什麼建議嗎?

回答

1

我注意到你的代碼開始兩個上下文但只結束一個。

這是我的擴展,它基本上和你的一樣。由於我沒有記憶問題,看起來可能是這個問題。

extension UIImage { 
    public func resizeToRect(_ size : CGSize) -> UIImage { 
     UIGraphicsBeginImageContext(size) 
     self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
     let resizedImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 
     return resizedImage! 
    } 
} 
+0

就是這樣!謝謝。 – Thoms

0

問題是這樣的:

UIGraphicsGetImageFromCurrentImageContext() 返回一個自動釋放的UIImage。 autorelease池保留這個圖像,直到你的代碼將控制返回到runloop,而你很久沒有這樣做。要解決此問題,請在使用之後製作thumb = nil

var thumb = UIImage() 

autoreleasepool { 
    thumb = lionImage.thumbnailWithMaxSize(image: lionImage, maxSize: 2000) 
    let myImage:UIImage = UIImage(UIImagePNGRepresentation(thumb)); 
    thumb = nil 
} 
myImageView.image = myImage 
+0

不幸的是,設置thumb = nil不能解決問題。內存仍然越來越大。只有當我使用原始圖像時,纔會按預期釋放內存。 – Thoms