当视图被卸载时,为什么我们要把这么多东西设置为nil?

时间:2012-10-25 03:07:51

标签: objective-c uiviewcontroller

-(void)viewDidUnload
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:LASTUPDATEDLOCATION object:nil];
    [self setHeaderViewofWholeTable:nil];
    [self setFooterViewofWholeTable:nil];
    [self setHeaderActivityIndicator:nil];
    [self setFooterActivityIndicator:nil];
    [self setLastUpdated:nil];
    [self setLblPullDowntoRefresh:nil];
    [self setRefreshArrow:nil];
    [self setContainerForFormerHeader:nil];
    [self setFooterContainer:nil];
    [super viewDidUnload];
}

我认为viewDidLoad被称为视图本身是零。当我们将视图设置为nil时,这些东西不会自动变为零吗?

我误解了什么?

4 个答案:

答案 0 :(得分:3)

在ARC之前,您需要手动释放已分配的对象。将标记为retain的属性设置为nil会释放。使用自动引用计数(ARC)功能时不再需要此功能,该功能默认在最新版本的Xcode附带的编译器中启用。

答案 1 :(得分:3)

好消息。从iOS 6开始,viewDidUnload已被弃用。在iOS 5及更早版本中,当内存不足时,您的视图可能已被卸载(并确保没有内存泄漏,您在此方法中释放了IBOutlets)。但是在iOS 6中不再调用它,因此不再需要。

现在,如果内存出现问题,您的视图控制器可以覆盖:

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

答案 2 :(得分:2)

其他一些答案涵盖了部分内容,但还有更多内容。视图控制器将调用其viewDidLoad方法。通常,这会导致保留IBOutlet,并且可能会分配和保留许多其他视图和对象。如果一切顺利,最终会取消分配视图控制器,并且需要释放所有这些保留的对象。

这是一条简单而快乐的道路。在内存不足的情况下,在iOS 5及更早版本中,可能会卸载视图控制器的视图。 viewDidUnload方法可以清除作为viewDidLoad进程一部分保留的所有其他对象。这是主要原因 - 在某些时候,可能会再次调用viewDidLoad来重新显示视图控制器的视图。

大多数人都会编写他们的viewDidLoad方法,因为它只会被调用一次。如果viewDidUnload方法正确清除对象,则可以。如果没有,下一次调用viewDidLoad将导致一堆内存泄漏。

如果你没有在viewDidUnload中正确清理内容,ARC几乎消除了内存泄漏的问题。但viewDidUnload仍然有助于在需要时清理内存。

如前所述,从iOS 6开始,视图控制器的视图从未在低内存条件下卸载,而viewDidUnload(和viewWillUnload)方法已被弃用。

如果您的应用仍然支持iOS 5以及iOS 6,则仍需要正确使用viewDidUnload。但如果您想在需要时释放内存,请使用didReceiveMemoryWarning

答案 3 :(得分:1)

我们设置了很多东西,以便尽可能多地释放内存并减少处理器压力并延长电池续航时间,并非所有对象都会自动从队列中删除。