4

PhotoScroller와 같은 페이지를 통해 스크롤되는 다른 이미지를 보여주는 scrollview가 있습니다. ARC를 사용하고 있습니다. 누군가 다른 페이지로 스크롤 할 때 UIImageView의 이미지 속성을 현재 표시되지 않고 nil로 설정합니다. 메모리 크래시가 여전히 발생하지 않도록 시도합니다. 그런 다음 사용자가 새 페이지로 스크롤하면 해당 페이지의 이미지가 UIImageView의 이미지 속성과 그 전후의 페이지로 설정되어 원활한보기가 가능해집니다. 페이지에 대한 UIImage는 모두 배열로 유지됩니다. 그러나 페이지를 스크롤하면 UIImageView의 image 속성을 nil로 설정해도 메모리에서 해제되지 않는 것처럼 메모리 사용이 계속 증가합니다. 내 UIImages 초기화하려면 initWithContentsOfFile을 사용합니다. imageNamedimageWithContentsOfFile도 시도했지만 운이 없었습니다. 여기 내있는 ScrollView 코드입니다 :uiimage를 nil로 설정하면 ARC로 메모리가 해제되지 않습니다.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
int indexShown = self.scrollView.bounds.origin.x/kScrollObjWidth;

페이지에 대한
for(NSNumber *index in indexesToRemove) 
{ 
    UIImageView *imgViewToRemove = [[self.scrollView subviews] objectAtIndex:[index intValue]]; 
    imgViewToRemove.image = nil; 
} 
[indexesToRemove removeAllObjects]; 

UIImageView *imgViewToReplace = [[self.scrollView subviews] objectAtIndex:indexShown]; 
[imgViewToReplace setImage:[pageUIImagesArr objectAtIndex:indexShown]]; 
[indexesToRemove addObject:[NSNumber numberWithInt:indexShown]]; 

if(indexShown != 0 && ![[[self.scrollView subviews] objectAtIndex:indexShown-1] image]) 
{ 
    imgViewToReplace = [[self.scrollView subviews] objectAtIndex:indexShown-1]; 
    [imgViewToReplace setImage:[pageUIImagesArr objectAtIndex:indexShown-1]]; 
    [indexesToRemove addObject:[NSNumber numberWithInt:indexShown-1]]; 
} 
if(indexShown != kNumImages-1 && ![[[self.scrollView subviews] objectAtIndex:indexShown+1] image]) 
{ 
    imgViewToReplace = [[self.scrollView subviews] objectAtIndex:indexShown+1]; 
    [imgViewToReplace setImage:[pageUIImagesArr objectAtIndex:indexShown+1]]; 
    [indexesToRemove addObject:[NSNumber numberWithInt:indexShown+1]]; 
} 

currentView = [[self.scrollView subviews] objectAtIndex:indexShown]; 
//check which view is being shown` 
+0

내가 발견 한 것은 이미지가 생성되는 방식이 큰 차이를 만듭니다. 대신 [UIImage imageNamed : xxxxx]; 내가 사용했습니다. NSString * filePath = [[NSBundle mainBundle] pathForResource : imageFileNameTemp ofType : @ "png"]; UIImage * image = [[UIImage alloc] initWithContentsOfFile : filePath]; 약 50 %의 라이브 바이트 및 # 살아있는 객체가 저장되었습니다. 나는 악기를 사용하여 검사했다. 정적 초기화 프로그램을 사용하지 않을 때 더 나은 결과를 얻지 못한다는 사실을 알게되었습니다. – nicktmro

답변

1

있는 UIImage의 모든 배열에서 개최된다.

UIImage 배열이 여전히 그들에 대한 참조를 잡고 있기 때문에 nil에의 재산 년대는 당신이 UIImageView을 설정할 때 해제되지 않습니다 '. 메모리 증가에 관해서는, 그것은 할당되고있는 다른 것일 수 있습니다. 인스트루먼트의 오브젝트 할당 도구를 사용하여 스크롤하면서 정확하게 무엇이 커지는 지 추적 해 보시기 바랍니다.

+0

흠. 하지만 응용 프로그램이 시작되면 배열에 uiimages를로드합니다. 난 단지 그들을 uiimageview의 이미지 속성으로 설정하고 다시 nil로 설정합니다. 나는 그것이 배열에서 인 경우에 생각해, 시작에 다만 부순 것이다. 필자는 악기를 확인했고 아직 표시되지 않은 새 이미지가 표시 될 때마다 메모리 사용량이 약 4MB 증가합니다. – Marty

+0

이미 표시된 이미지가 다시 표시 될 때 증가하지 않습니다? – Andrew

+0

예, 처음로드 될 때만 커집니다. 그게 나 혼란 스럽다. – Marty

관련 문제