2017-09-06 93 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)経由でイメージを読み込もうとしましたが、成功しませんでした。 提案がありますか?

UIGraphicsGetImageFromCurrentImageContext()自動解放UIImageを返し :

答えて

1

あなたのコードは2つのコンテキストから始まり、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

問題は、このです。オートレリープールは、あなたのコードが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

関連する問題