1
-(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 时,所有这些不会自动变为 nil 吗?

我有什么误解?

4

4 回答 4

3

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

于 2012-10-25T03:14:04.547 回答
3

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

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
于 2012-10-25T03:18:16.243 回答
2

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

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

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

如果您没有在viewDidUnload. 但viewDidUnload仍然有助于在需要时清理内存。

如前所述,从 iOS 6 开始,视图控制器的视图在内存不足的情况下从不卸载,并且viewDidUnload(and viewWillUnload) 方法已被弃用。

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

于 2012-10-25T03:38:27.450 回答
1

我们将很多东西设置为 nil 以释放尽可能多的内存并减少处理器压力并延长电池寿命,并非所有对象都会自动从队列中删除。

于 2012-10-25T03:11:32.637 回答