2010-02-25 12 views
1

URL에서 가져온 이미지의 축소판이 포함 된 tableview에 대한 순진한 코드 (동기식 호출이라는 의미에서)를 작성했습니다. 이미지를 끌어 cellForRowAtIndexPath의 코드는 다음과 같이 진행됩니다이미지 축소판을로드하는 중 문제가 발생했습니다.

data = (data == nil)? [[NSData alloc] initWithContentsOfURL:photoThumbPage] : [data initWithContentsOfURL:photoThumbPage]; 
thumbImg = (thumbImg == nil)? [[UIImage alloc] initWithData:data] : [thumbImg initWithData:data]; 

나는 새로운있는 NSData하고있는 UIImage마다 할당하지와 속도 향상이있을 수 있다고 생각, 그래서 난 내 클래스를 정의했다. 미리보기 이미지를 얻을 때마다 정의되어 있는지 확인하고, 이미있는 경우 다른 값으로 다시 초기화합니다.

나는이 문제를 여기에 쓰면서 모든 종류의 나쁜 일이 발생했다고 생각할 수 있습니다. :) 내 tableview를 스크롤 할 때 가끔씩 두 개 이상의 항목이 같은 이미지를 공유 할 수 있습니다. 내 애플 리케이션을 충돌하지 않는 콘솔,하지만 내 jpeg 파일이 손상되었습니다 말해줘.

이러한 요청은 모두 비동기 적이어야하며 실제로 이러한 결과를 캐싱해야한다는 사실을 제쳐두고 아무도 내가 걸려 넘어 질 수 있다고 말할 수 있습니까? cellForRowAtIndexPath가 표시되는 각 셀에 대해 호출되고 내 코드가 동기이면 nsdata 및 uiimage 변수가 호출을 통해 유지되어야하는 이유가 없어야합니다 (init 메소드로 지워지는 것 같습니다). 이 멤버 변수를 바꿔서 매번 초기화했습니다.

NSData *data_local = [[NSData alloc] initWithContentsOfURL:photoThumbPage]; 
UIImage *thumbImg_local = [[UIImage alloc] initWithData:data]; 

그리고 잘 작동합니다. 축소판을로드 할 때마다 새 NSData 및 UIImage를 할당하는 대신 재사용 가능한 멤버 변수를 할당 할 때 어떤 이점이 있습니까? 아니면 그냥 재앙을위한 처방인가? 모든 의견/도움에 감사드립니다.

답변

0

문제는 회원 변수를 재사용하고 있지만의 동일한 공간 인 을 재사용한다는 것입니다. 두 번째로 데이터 초기화를 호출하면 이전과 동일한 메모리 공간 (alloc 메소드에서 온 공간)을 계속 사용하게됩니다. 결과적으로 하나 이상의 UIImage가 동일한 메모리 영역을 가리키고, 따라서 다중 이미지와 새로운 UIImage 아래에서 변경되는 기본 데이터가 새로 만들어지면 잘못된 jpeg에 대한 오류 메시지가 표시됩니다.

+0

감사합니다. 그것은 많은 의미가 있습니다. – Ying

관련 문제