티스토리 뷰

iOS

UIGraphicsImageRenderer Memory Leak

Basic Developer 2023. 3. 10. 22:22

UIImage는 단지 데이터이다. 이를 디코딩하면 비로소 이미지의 의미를 갖게된다.

디코딩한것을 화면에 보여주는것을 렌더링이라고 한다.

데이터 -> 이미지데이터로 변환하는 디코딩은 많은 CPU 사용량을 차지한다.

애초에 데이터를 줄여주면 변환하는 디코딩에 사용되는 CPU는 적어질 것이다.

 

"UIGraphicsImageRenderer" 은 이미지 데이터를 설정한 크기로 줄이고 

디코딩후에 렌더링 할 수있게 도와준다.

참고로 이미지 데이터 UIImage는 "imageView.image = UIIMage" 할때 디코딩 되고 렌더링이 된다.

사용법은 

    private func downImageSize(image:UIImage,newWidth:CGFloat) -> UIImage{
        let scale = newWidth / image.size.width
        let newHeight = image.size.height * scale
        
        let size = CGSize(width: newWidth, height: newHeight)
        let render = UIGraphicsImageRenderer(size: size)
        let renderImage = render.image { context in
            	image.draw(in: CGRect(origin: .zero, size: size))
        	}
        return renderImage
    }

 이미지를 잘 줄여준다..

그런데 문제가 생겼다.

Memory Leak이 발생하는것.

처음에 NSDictionary로 메모리 릭이 발생하길래 뭔가 했다.

Profile로 실행해서 Instruments를 통해 확인해보니 UIGraphicsImageRenderer에서 발생하는것이였다.

구글링을 해서 같은 기능의 옛날 코드가 있길래 하는 메서드를 구현해 봤더니 릭이 사라졌다.!

할당해제가 안되어서 릭이 발생한다고 생각해서 End가 있는 함수 세트로 구현해봤다. ㅋ

    private func downImageSize(image:UIImage,newWidth:CGFloat) -> UIImage{
        let scale = newWidth / image.size.width
        let newHeight = image.size.height * scale
        
        let size = CGSize(width: newWidth, height: newHeight)
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0) // 달라진 부분
        image.draw(in: CGRect(origin: .zero, size: size)) //
        defer {UIGraphicsEndImageContext()} //
        return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage() //
    }

 

'iOS' 카테고리의 다른 글

Xcode binary executable file - nm Command  (0) 2021.11.19
Xcode Dependencies - 종속  (2) 2021.09.07
Framework 개념 및 적용(Static,Dynamic)  (0) 2021.09.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함