如何在视图控制器数组中释放视图控制器?

时间:2012-02-11 08:18:19

标签: ios memory-management viewcontroller

我的内存管理有问题。 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];
    }


}

这是我的卸载视图控制器方法,它卸载除了当前页面的控制器之外的所有控制器,但它似乎不起作用,因为内存不断增加。

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

如何正确编写unloadviewcontroller?

1 个答案:

答案 0 :(得分:2)

您正在添加一个指向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];
}