Установка uiimage в nil не освобождает память с ARC - PullRequest
4 голосов
/ 02 ноября 2011

У меня есть прокрутка, которая показывает разные изображения при прокрутке страниц, например, PhotoScroller. Я использую ARC. Когда кто-то прокручивает на другую страницу, я устанавливаю свойство изображения UIImageView, которое в настоящее время не отображается, равным nil, как (пытаясь) избежать сбоев памяти, которые все еще происходят. Затем, когда пользователь переходит к новой странице, изображение для этой страницы устанавливается как свойство изображения UIImageView, а также страница до и после нее (для плавного просмотра). UIImage для страниц все хранятся в массиве. Тем не менее, пока я прокручиваю страницы, использование памяти продолжает расти, как будто установка свойства image в UIImageView на nil не освобождает его из памяти. Я использую initWithContentsOfFile для инициализации своих UIImages. Я тоже пытался с imageNamed и imageWithContentsOfFile, но безуспешно. Вот мой код прокрутки:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {<br> 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`

1 Ответ

2 голосов
/ 02 ноября 2011

UIImage для страниц все содержатся в массиве.

UIImage не освобождаются, когда вы устанавливаете свойство UIImageView в nil потому что массив все еще содержит ссылку на них.Что касается роста памяти, это может быть что-то еще, что выделяется.Я бы посоветовал взглянуть на инструмент Распределения объектов Инструмента, чтобы отследить, что именно растет при прокрутке.

...