2017-09-06 8 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

나는 두 개의 컨텍스트를 시작하지만 하나만 끝나는 코드를 발견했습니다.

내 확장 기능은 다음과 같습니다. 기본적으로 귀하의 확장 기능과 동일합니다. 메모리 문제가 없으므로 문제가 될 수 있습니다.

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

문제는 이것이다. 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