Objective c 卸载视图时,我们为什么要麻烦将这么多内容设置为零?

Objective c 卸载视图时,我们为什么要麻烦将这么多内容设置为零?,objective-c,uiviewcontroller,Objective C,Uiviewcontroller,我认为viewDidLoad称为视图本身为零。当我们将视图设置为零时,所有这些东西不是都会自动变为零吗 我误解了什么?我们设置了这么多东西为零,以释放尽可能多的内存,减少处理器压力并延长电池寿命,但并非所有对象都会自动从队列中移除。我们设置了这么多东西为零,以释放尽可能多的内存,减少处理器压力并延长电池寿命,并非所有对象都会自动从队列中删除。在ARC之前,您需要手动释放分配的对象。将标记为retain的属性设置为nil将执行释放操作。当您使用自动引用计数ARC功能时,这不再是必需的,该功能在最新

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


我误解了什么?

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

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

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

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

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

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

-(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];
}
好消息。从iOS 6开始,viewDidUnload已被弃用。在iOS 5及更早版本中,当内存不足时,可能会卸载视图,为了确保没有内存泄漏,您使用此方法释放了IBOutlets。但这在iOS 6中不再被调用,因此不再是一项要求

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

-(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方法。通常这会导致IBOutlets被保留,并且可能会分配和保留许多其他视图和对象。如果一切顺利,视图控制器最终将被释放,所有保留的对象都需要释放

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

大多数人在编写viewDidLoad方法时都认为它只会被调用一次。如果viewDidUnload方法正确地清除了对象,这是正常的。否则,下一次调用viewDidLoad将导致大量内存泄漏

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

如前所述,在iOS 6中,视图控制器的视图在内存不足的情况下从未卸载,viewDidUnload和viewWillUnload方法已被弃用


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

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

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

大多数人在编写viewDidLoad方法时都认为它只会被调用一次。如果viewDidUnload方法正确地清除了对象,这是正常的。否则,下一次调用viewDidLoad将导致大量内存泄漏

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

如前所述,在iOS 6中,视图控制器的视图在低内存条件下从未卸载,vie wDidUnload和viewWillUnload方法已被弃用



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

我认为这是因为需要避免内存泄漏。我认为这是因为需要避免内存泄漏。我知道。问题是,即使在ARC之后,仍然会生成将这些设置为nil的代码片段。我知道。问题是,即使在ARC之后,仍然会生成将这些设置为nil的代码片段。这实际上是一个更好的答案,尽管有点离题。你需要更多的关注点。这是一个更好的答案,虽然有点离题。你需要更多的分数。每个人+1。这一点其实很明显。我想问的是,既然即使没有它,内存也会被释放,我们为什么还要费心呢?我想我们用的是?ViewDidUnload方法,因为您可以非常肯定地知道,与该特定视图关联的任何对象都可以在与视图同时安全有效地取消分配。@HaryantoCiu-除非我们选择释放内存,否则不会释放内存。viewDidLoad可能会被多次调用。如果viewDidUnload没有正确释放所有内容,您将有大量内存泄漏。无论如何都不会发布。当然,ARC和iOS 6现在比过去更不真实了。每个人+1。这一点其实很明显。我想问的是,既然即使没有它,内存也会被释放,我们为什么还要费心呢?我想我们用的是?ViewDidUnload方法,因为您可以非常肯定地知道,与该特定视图关联的任何对象都可以在与视图同时安全有效地取消分配。@HaryantoCiu-除非我们选择释放内存,否则不会释放内存。viewDidLoad可能会被多次调用。如果viewDidUnload没有正确释放所有内容,您将有大量内存泄漏。无论如何都不会发布。当然,ARC和iOS 6现在比过去更不真实了。在ARC下,将这些设置为零不会起任何作用,因为viewController本身很快就会消失,它引用的任何东西也会消失。这是主要问题+1也是最全面的答案。@HaryantoCiu:viewController本身在viewDidUnload之后不久就会消失,这不是真的。视图可以在视图控制器的生存期内多次加载和卸载。但这不会使用ARC创建内存泄漏,因为如果在viewDidLoad中重新创建对象,旧对象将自动释放。但即使使用ARC,在内存不足的情况下释放这些对象以释放内存也是有意义的,正如maddy正确地说的那样。此评论中的所有内容都与iOS有关您的意思是卸载后viewController仍在上面?这就是我想知道的。啊,我唯一调用viewDidload的时候是viewController即将被销毁的时候。我懂了。情况并非总是如此。@HaryantoCiu:是的,只有在iOS上的低内存情况下,在ARC下才卸载视图。将这些设置为“零”不会起任何作用,因为viewController本身很快就会消失,它引用的任何内容也会消失。这是主要问题+1也是最全面的答案。@HaryantoCiu:viewController本身在viewDidUnload之后不久就会消失,这不是真的。视图可以在视图控制器的生存期内多次加载和卸载。但这不会使用ARC创建内存泄漏,因为如果在viewDidLoad中重新创建对象,旧对象将自动释放。但即使使用ARC,在内存不足的情况下释放这些对象以释放内存也是有意义的,正如maddy正确地说的那样。此评论中的所有内容都与iOS有关您的意思是卸载后viewController仍在上面?这就是我想知道的。啊,我唯一调用viewDidload的时候是viewController即将被销毁的时候。我懂了。情况并非总是如此。@HaryantoCiu:是的,只有在iOS内存不足的情况下才会卸载视图