【问题标题】:Memory management of View Controllers视图控制器的内存管理
【发布时间】:2012-09-03 19:00:24
【问题描述】:

我正在创建视图控制器,其中包含一些要显示的信息(图像、按钮、手势、文本等)并将它们添加到滚动中。

productsVCs = [[NSMutableArray alloc] init];

for (int i = 1; i <= [self.products count]; i++) {
    productsSingle *single = [[productosSingle alloc] init];
    single.view.frame = CGRectMake(x, y, 200, 148);
    single.delegate = self;
    [single setInfo:[self.products objectAtIndex:i-1]];
    [scroll addSubview:single.view];
    [productsVCs addObject:single];
}

如您所见,我正在使用我分配的这些视图控制器做三件重要的事情,我写了我认为让 ARC 释放这些对象所需的内容。

1) 设置委托。 - 我必须将委托设置为零吗?

2) 将视图添加为子视图。 - 从超级视图中删除?

3) 将控制器添加到数组中。 - 从数组中移除?

我的问题是,这些视图控制器何时被释放?使用弧。感谢您的帮助。

【问题讨论】:

    标签: ios memory-management


    【解决方案1】:

    当您的 ViewController(具有滚动视图)将被释放时,对象 productsSingle 将被释放。

    ARC 在编译时工作,因此 ARC 会为您插入对对象的 release 方法的调用。编译项目时,ARC 插入对 release 方法的调用,如下所示:

    [single setInfo:[self.products objectAtIndex:i-1]];
    [scroll addSubview:single.view];
    [single release]; //ARC inserts this line
    

    【讨论】:

      【解决方案2】:

      如果您使用 ARC,则不必担心释放对象,因为 ARC 会为您完成。您仍然可以在您的控制器中设置强持有的实例变量,以便在您的 viewDidUnload 方法中释放。

      现在,当任何持有对它们的引用被释放时,您的视图控制器将被释放,在这种情况下,它将是应用程序本身或创建控制器的另一个控制器。如果你不持有对它的引用,那么一旦你退出代码块,它就会被释放。

      Here's a little guide on using ARC

      【讨论】:

      • 如果我猜想是我的 viewController 的“持有引用的东西”没有被释放怎么办。假设这是我的主视图,我只是动态加载这些视图控制器,当有新信息可用时,我希望将它们删除并再次执行此循环。希望您理解我要解释的内容。
      • 您询问了分配视图控制器的问题,所以这就是我所说的持有它们的东西。您的意思是当您有新数据并刷新您正在显示的内容时,您只是在视图上替换这些元素?如果您将实例变量保存到这些视图元素,它们将消失,如果没有引用对象,则对象仅存在于本地范围内。如果要替换添加到视图中的元素,则必须将它们全部替换为 nil,以避免内存过载。
      • 您可以通过将该数组保存为 ivar 并在视图元素上调用 removeFromSuperview 来实现。或者遍历视图的 subviews 数组并删除与您的 productosSingle 类匹配的视图。
      猜你喜欢
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多