Как освободить контроллер представления внутри массива контроллеров представления? - PullRequest
2 голосов
/ 11 февраля 2012

У меня проблема с управлением памятью.A имеет scrollview, и каждая страница в нем загружается из массива контроллеров представления.Я загружаю страницу прокрутки, вызывая следующий метод:

- (void)loadScrollViewWithPage:(int)page {

    if (page < 0) return;
    if (page >= kNumberOfPages) return;


    BancaTableViewController *controller = [viewControllers objectAtIndex:page];


    if ((NSNull *)controller == [NSNull null]) {

        controller=[[BancaTableViewController alloc] initWithPageNumber:page];
        controller.banks=banks;
        [controllersetDelegate:self];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
        [controller release];
    }

    // add the controller's view to the scroll view
    if (nil == controller.view.superview) {
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.view.frame = frame;
        [scrollView addSubview:controller.view];
    }


}

Это мой метод контроллера представления unload, который выгружает все контроллеры, кроме контроллера текущей страницы, но, похоже, он не работает, потому что память продолжает увеличиваться.

- (void)unloadScrollViewWithPage:(int)page {
    for (unsigned i = 0; i < kNumberOfPages; i++) {
      if(i!=page){
       [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
      }
    }
}

Как правильно написать контроллер unloadview?

1 Ответ

2 голосов
/ 11 февраля 2012

Вы добавляете жесткий указатель к scrollView, но никогда не удаляете объект. (т.е. вы продолжаете добавлять подпункты в scrollView и никогда не удаляете их.

[scrollView addSubview:controller.view];

Попробуйте это ...

Добавьте тег в представление вашего контроллера, когда вы добавите их в scrollView, а затем удалите его перед загрузкой нового контроллера. Проверьте синтаксис - из памяти - не проверено

if ((NSNull *)controller == [NSNull null]) {

    controller=[[BancaTableViewController alloc] initWithPageNumber:page];
    controller.banks=banks;
    controller.tag = 3;
    [controllersetDelegate:self];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    [controller release];
}

// add the controller's view to the scroll view
if (nil == controller.view.superview) {
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [scrollView removeFromView:[scrollView viewWithTag:3]];
    [scrollView addSubview:controller.view];
}
...