문제

CGLAYER DOC의 인용 :

석영은 cglayer 객체를 포함하여 재사용 된 모든 객체를 캐시합니다.

큰 페이지에서 메모리에 문제가 있으며 뷰가 켜져있는/꺼짐 화면에 따라 뷰가 릴리스되고 재현되는 간단한 메커니즘을 구현하려고합니다.

단순성을 위해 네트워크 요청의 결과로 생성 된 많은 uiimages가 어딘가에 배열에 저장되었다고 말합니다. 나는 UIIMAGEVIEW를 그렇게 만듭니다.

anImage = [anArray objectAtIndex:0];
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw
[imgView release];             // owned by mainView now
[...]                          // wait a bit for draw cycle
[imgView removeFromSuperview]; // memory doesn't go down

imgView 화면을 벗어납니다 removedFromSuperview 그리고 출시. 좋아요? 쿼츠에 존재하는 cglayer는 제거되지 않습니다. 왜냐하면 anImage 여전히 존재합니다.

이 문제를 어떻게 해결할 수 있습니까? 이 시나리오의 유일한 방법은 다른 포인터 주소로 쿼츠의 뒷면 뒤에 동일한 이미지를 만들고 이전 이미지를 삭제하는 것입니다. 그리고이를 수행하는 유일한 방법은 이미지 (UIIMAGE가 NSCODING을 구현하지 않음)를 '딥 카피'하거나 네트워크를 통해 다시 요청하는 것입니다 (느린).

내가 생각하는 것은 내 이미지를 데이터베이스에 SQLLITE로 만들어서 화면에서 볼 때마다 리칭해야한다는 것입니다. 그러나 나는 이것에 대한 사람들의 생각을 듣고 싶습니다.

도움이 되었습니까?

해결책

여기에서 imgview를 0에서 1까지 증가시킵니다.

UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];

다음 줄에서 MainView는 참조 수를 증가시킵니다. (이제 2)

[mainView addSubview:imgView]; // Quartz eats memory for view after first draw

여기에서 imgview를 릴리스하고 참조 수는 다시 하나로 내려갑니다.

[imgView release]; // owned by mainView now

나는 당신의 메모리 문제가 애니메이션과 관련이 있다고 생각하지 않습니다. imgview가 하위 뷰 인 한 해당 객체가 화면에 그리기 위해 해당 객체가 필요하지 않기 때문에 해당 객체를 제거하지 않습니다.

다음 줄이 의미하는 바는, 당신이 당신의 cglayer에게 프로그래밍 방식으로 그려지면, 당신이 그린 것을 캐시로 쿼츠로, 끊임없이 같은 것을 다시 그리기를하지 않는다는 것입니다. 실제로 하위 뷰 추가와 관련이 없습니다.

석영은 cglayer 객체를 포함하여 재사용 된 모든 객체를 캐시합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top