【问题标题】:iOS: When is best to deallocate a model object in a view controller?iOS:何时最好在视图控制器中释放模型对象?
【发布时间】:2011-05-25 10:02:58
【问题描述】:

我在这里有一个相当基本的问题。我发现我经常在视图控制器的 viewDidLoad: 方法中实例化模型对象,例如在用于填充视图控制器中表格元素的 Web 服务对象的情况下:

- (void)viewDidLoad {
    [super viewDidLoad];    
    itemService = [[BlogItemService alloc] init];
}

我应该在哪里发布 itemService?在 viewDidUnload 还是 dealloc 中?

此外,在 viewDidLoad 中分配这样的对象是否常见?难道没有更合适的init类型方法吗?

更新:我特别担心。假设我在 dealloc 中取消分配 itemService。如果视图被卸载然后重新加载,但视图控制器没有被释放,我会不会有内存泄漏,因为 itemService 的前一个实例在实例化新实例时是孤立的?

【问题讨论】:

    标签: iphone ios memory-management uiviewcontroller


    【解决方案1】:

    我应该在哪里发布 itemService?在 viewDidUnload 还是 dealloc 中?

    如果对象是轻量级的或需要很长时间才能创建,请在 dealloc 中进行。如果它消耗大量内存,则在 viewDidLoad/viewDidUnload 中使用匹配对。

    此外,在 viewDidLoad 中分配这样的对象是否常见?

    是的

    没有更合适的init类型方法吗?

    指定的初始化器(在某些情况下)

    更新:我特别担心。假设我在 dealloc 中取消分配 itemService。如果视图被卸载然后重新加载,但视图控制器没有被释放,我会不会有内存泄漏,因为 itemService 的前一个实例在实例化新实例时是孤立的?

    为避免这种情况,请使用:

    BlogItemService * item = [[BlogItemService alloc] init];
    self.itemService = item;
    [item release], item = nil;
    

    【讨论】:

      【解决方案2】:

      这是非常罕见的情况,但是如果您卸载然后再次加载视图,您将按照您的建议进行泄漏。所以在哪里分配对象是一个很好的问题,它取决于你的选择。每次加载视图时加载对象可能会更好,因为它们非常重,并且一些小对象可能更容易在 init 中加载。但是如果你想多次加载和卸载视图,你也要小心处理你的视图控制器,因为常见的模式是每次视图消失时都销毁控制器(而且大多数情况下这是一个很好的解决方案)。

      【讨论】:

        【解决方案3】:


        你应该在 dealloc 中释放对象

        您可以使用以下方式分配内存:

        itemService=[BlogItemService new];  
        

        【讨论】:

        • 谢谢 Nitish .. 我的下一个问题是:如果出于某种原因视图被卸载然后重新加载(但视图控制器没有被释放),我不会有内存泄漏作为 itemService当第二次调用 viewDidLoad 并且之前的 itemService 实例变成孤儿时会重新分配?
        • 不,不会有任何内存泄漏,因为您在每次视图卸载时都执行 -(void)viewDidUnload。
        【解决方案4】:

        如果你问我初始化模型对象的最佳位置是在类的 init 方法中,在 deallocrelease 它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-04
          • 1970-01-01
          • 2014-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多