PhotoScroller와 같은 페이지를 통해 스크롤되는 다른 이미지를 보여주는 scrollview가 있습니다. ARC를 사용하고 있습니다. 누군가 다른 페이지로 스크롤 할 때 UIImageView의 이미지 속성을 현재 표시되지 않고 nil로 설정합니다. 메모리 크래시가 여전히 발생하지 않도록 시도합니다. 그런 다음 사용자가 새 페이지로 스크롤하면 해당 페이지의 이미지가 UIImageView의 이미지 속성과 그 전후의 페이지로 설정되어 원활한보기가 가능해집니다. 페이지에 대한 UIImage는 모두 배열로 유지됩니다. 그러나 페이지를 스크롤하면 UIImageView의 image
속성을 nil로 설정해도 메모리에서 해제되지 않는 것처럼 메모리 사용이 계속 증가합니다. 내 UIImages 초기화하려면 initWithContentsOfFile
을 사용합니다. imageNamed
과 imageWithContentsOfFile
도 시도했지만 운이 없었습니다. 여기 내있는 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`
내가 발견 한 것은 이미지가 생성되는 방식이 큰 차이를 만듭니다. 대신 [UIImage imageNamed : xxxxx]; 내가 사용했습니다. NSString * filePath = [[NSBundle mainBundle] pathForResource : imageFileNameTemp ofType : @ "png"]; UIImage * image = [[UIImage alloc] initWithContentsOfFile : filePath]; 약 50 %의 라이브 바이트 및 # 살아있는 객체가 저장되었습니다. 나는 악기를 사용하여 검사했다. 정적 초기화 프로그램을 사용하지 않을 때 더 나은 결과를 얻지 못한다는 사실을 알게되었습니다. – nicktmro