Управление памятью, ARC - что с нуля? - PullRequest
0 голосов
/ 08 марта 2012

Фон -

Я использую автоматический подсчет ссылок на проект.Корневое представление - это табличное представление (настройка «Мастер / подробности») со списком «слайд-шоу».Нажмите на ячейку таблицы, и вы попадете в подробный вид, который состоит из вида Scroll с представлениями (viewController.view) в нем (это «слайд-шоу»).Каждое слайд-шоу имеет переднюю и заднюю обложки (один и тот же контроллер представления отформатирован по-разному), которые помещают в переменное количество страниц.Вот код для загрузки слайд-шоу:

- (void)loadScrollView
{    
// The front and back cover are set in Interface Builder because they
// are reused for every slide show, just labels are changed.
[self.scrollView addSubview:self.frontCoverViewController.view];
[self.frontCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:YES];
[self.pagesArray addObject:self.frontCoverViewController];

for (int i = 0; i < [self getTotalNumberOfComps]; i++) 
{
    PageViewController *pageView = [[PageViewController alloc] init];
    pageView.data = [_compsArray objectAtIndex:i];

    [_scrollView addSubview:pageView.view];
    pageView.data.imgView = pageView.imageView;
    pageView.slideShowViewController = self;
    [_pagesArray addObject:pageView];
}

[self.scrollView addSubview:self.backCoverViewController.view];
[self.backCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:NO];
[self.pagesArray addObject:self.backCoverViewController];

[self.scrollView bringSubviewToFront:_frontCoverViewController.view];
[self setCurrentPage:0];
}

Проблема -

Так что я пытаюсь повторно использовать этот контроллер представления слайд-шоу, поэтому мне нужно обнулить и восстановитьстраницы в середине, потому что каждое слайд-шоу имеет разное количество слайдов.Обратите внимание, что слайд [PageViewController] - это просто представление с изображением в нем.Он обладает большей функциональностью, поэтому нам нужен контроллер, однако основным дисплеем VC является ImageView.Я создал следующий метод, чтобы «очистить» слайд-шоу перед повторным запуском loadScrollView с новыми данными.Вот пустой метод:

- (void)saflyEmptyScrollView
{
for (int i = 0; i < [self.pagesArray count]; i++) 
{
    if (i == 0 && i == ([self.pagesArray count]-1)) {
        CoverViewController *cover = (CoverViewController*)[self.pagesArray objectAtIndex:i];
        [cover.view removeFromSuperview]; 
    } else {
        PageViewController *page = (PageViewController*)[self.pagesArray objectAtIndex:i];
        [page.view removeFromSuperview];
        page = nil;
    }
}
self.pagesArray = nil;
self.pagesArray = [[NSMutableArray alloc] init];
} 

Большой вопрос -

Мой главный вопрос: нужно ли мне установить ImageView каждой из этих страниц на ноль?Или установка самой страницы на nil также освобождает память, используемую ImageView / Labels / и т.д., которые используются в этом контроллере представления?

Я попытался добавить self.imageView = nil;в методы viewDidUnload и viewWillUnload PageViewController (по одному не в обоих), и я понял, что установка page = nil не вызывает методы страниц Unload.Правильно ли я освобождаю память?

Я прочитал много статей, но я все еще не уверен, что управляю памятью наилучшим образом.Большое спасибо за помощь!

1 Ответ

6 голосов
/ 08 марта 2012

Как правило, вам не нужно устанавливать нулевые значения. И в этом конкретном случае установка nil ничего не делает.

Строка page = nil; является избыточной, поскольку переменная page в любом случае сразу выходит из области видимости. ARC знает это, и вам не нужно устанавливать его на ноль.

И self.pagesArray = nil; является избыточным, потому что вы следуете за ним с self.pagesArray = [[NSMutableArray alloc] init];. Достаточно будет второй строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...