gpt4 book ai didi

ios - 那么 ARC 和在 viewDidUnload 上发布属性/ subview 有什么关系

转载 作者:行者123 更新时间:2023-12-01 17:27:10 25 4
gpt4 key购买 nike

我仍在学习 iOS 开发,并且一直在使用各种教程和书籍。有些是 ARC 之前的,有些是 ARC 的。

在某些情况下,我们被教导在 viewDidUnload 上释放 ViewController 的所有属性和 subview ,但在某些情况下,我被告知不再需要这样做。

有人能给出肯定的答案吗?在 iOS 5+ 中,是否必须完成整个操作:

-(void)viewDidUnload
{
[super viewDidUnload];
self.photoViewCell = nil;
self.photoImageView = nil;
self.firstNameTextField = nil;
self.lastNameTextField = nil;
}

... 或不?如果是这样,这仅适用于 UIView 的后代属性还是适用于 ViewController 的所有属性?

谢谢

最佳答案

所以每个 View 都有多个所有者。当“所有者计数”(通常称为 retainCount)达到 0 时,该对象将被销毁。

在 iOS 5 中,我们现在有弱引用,这本质上意味着“不拥有这个对象”。

在 iOS 5 之前,在我们的头文件中,你会看到

IBOutlet UILabel *myLabel;

这个标签被添加到 XIB 文件的 View 中。在这种情况下,myLabel 有 2 个所有者:它是 super View (XIB 文件中的 View )和 View Controller (通过拥有 IBOutlet)。当调用 viewDidUnload get 时, View Controller 的 View 已被释放,因此它对 myLabel 的所有权消失了。所以此时 myLabel 只有 1 个所有者,即 View Controller 。所以我们需要在 viewDidLoad 中释放它以确保它没有任何所有者并因此被销毁。

在 iOS 5 中,您会经常看到这种情况
__weak IBOutlet UILabel *myLabel

这就是说我们不希望 View Controller 成为 myLabel 的所有者。所以唯一的所有者是 View Controller 的 View 。所以当 viewDidUnload get 被调用时, View Controller 的 View 已经被释放了,因此它对 myLabel 的所有权也被释放了。在这种情况下,myLabel 现在没有所有者并且它的内存被释放。不需要 self.myLabel = nil;那里。

因此,对于 iOS 5,建议将所有 IBOutlets 设为弱引用。有了这个,你甚至不需要实现 viewDidUnload,因为所有的内存都已经为你处理好了。

但即使您使用的是 iOS 5,如果您的 IBOutlets 不是弱引用,您将需要 viewDidUnload 中的代码。

关于ios - 那么 ARC 和在 viewDidUnload 上发布属性/ subview 有什么关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com