#ios #uiscrollview #uiimageview #uiimage #automatic-ref-counting
#iOS #uiscrollview uiscrollview #uiimageview uiimageview #uiimage #автоматический подсчет ссылок
Вопрос:
У меня есть scrollview, который показывает разные изображения при прокрутке страниц, например PhotoScroller. Я использую ARC. Когда кто-то переходит на другую страницу, я устанавливаю для свойства изображения UIImageView, которое в настоящее время не отображается, значение nil, поскольку (пытается) избежать сбоев памяти, которые все еще происходят. Затем, когда пользователь переходит на новую страницу, изображение для этой страницы устанавливается в качестве свойства изображения UIImageView, а также страницы до и после нее (для плавного просмотра). Все UIImage для страниц хранятся в массиве. Тем не менее, когда я прокручиваю страницы, использование памяти продолжает расти, как будто установка image
для свойства UIImageView значения nil не освобождает его из памяти. Я использую initWithContentsOfFile
для инициализации своих UIImages. Я imageNamed
imageWithContentsOfFile
тоже пробовал с and, но безуспешно. Вот мой код scrollview:
- (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 amp;amp; ![[[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 amp;amp; ![[[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. Я обнаружил, что способ создания изображений имеет огромное значение. Вместо [UIImage imageNamed:xxxxx]; Я использовал NSString *filePath = [[NSBundle mainBundle] Путь к источнику:imageFileNameTemp OfType:@»png»]; UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]; Это сэкономило мне около 50% живых байтов и #живых объектов. Я проверил с помощью инструмента распределения. Меня озадачивает, что вы не видите лучших результатов, если не используете статический инициализатор.
Ответ №1:
Все UIImage для страниц хранятся в массиве.
UIImage
‘s не освобождаются, когда вы устанавливаете UIImageView
для свойства ‘s nil
значение, потому что массив все еще содержит ссылку на них. Что касается увеличения памяти, это может быть что-то еще, что выделяется. Я бы посоветовал взглянуть на инструмент выделения объектов Instrument, чтобы отследить, что именно растет при прокрутке.
Комментарии:
1. хм. но я загружаю uiimages в массив при запуске приложения. я только устанавливаю их как свойство изображения uiimageview, а затем возвращаю ему значение nil. я подумал, что если бы это было из-за нахождения в массиве, это просто привело бы к сбою при запуске. я проверил приборы, и использование памяти увеличивается примерно на 4 МБ каждый раз, когда появляется новое изображение, которое еще не было показано.
2. перестает ли он расти, когда изображения, которые уже были показаны, показываются повторно?
3. да, он увеличивается только при первоначальной загрузке. вот что меня смущает.
4. для тех, кому интересно, что я в конечном итоге сделал, это заменил массив uiimages массивом nsstrings, который содержал путь к изображению, а затем загрузил изображения в то время, когда они мне были нужны, так что, когда я установил для них значение nil после того, как я закончил с ними, ссылка не удерживаласьдля них.