让我们看看我们是否可以提供帮助:
如果我有UIViewController,在他里面有这样的强自定义视图:@property (nonatomic) UIView myView;(如果我们没有指定任何东西,默认是强的)。如果这个观点是弱的,我知道不需要在意释放它,但是强呢?在我的 ViewController didDisappear / dealloc 强大后它是否还活着?
不要考虑引用计数或释放,ARC 真的可以扭转局面。 strong、weak等属性与变量相关联,您可以通过以变量为中心的视图来理解这一点,其中变量是参与者——控制被引用对象生命周期的实体。
当一个引用被存储到一个具有 strong 属性的变量中时采用这种观点,然后该变量会通知 ARC 它需要被引用的对象。
从变量中删除该引用;例如通过用另一个引用或nil 覆盖它;然后变量告诉 ARC 它不再需要被引用的对象。
只要至少有一个变量告诉 ARC 该对象是必需的并且尚未撤销该要求,ARC 本身就会简单地保留一个对象。
您的问题是,当 ARC 删除具有实例变量且具有强属性的对象时会发生什么。从以变量为中心的观点来看,问题变成了:当变量本身被销毁时会发生什么?
答案是具有strong属性的变量的最后一个动作。并在其中存储了一个引用,就是告诉 ARC 该变量不再需要保留引用的对象。
- 我应该在 viewWillDisappear 中将此视图设置为 nil 吗?
如果变量本身在您需要存储在变量中的引用所引用的对象之后很长时间仍将继续存在,则只需将具有strong属性的变量设置为nil。
例如如果您有一个长期存在的对象,该对象在其生命周期内会在其实例变量之一中短时间存储对大对象的引用,那么在其他时间将该变量设置为 nil 是有意义的。
- 为什么当我创建一个弱属性时,我调用它的“init”方法后它就不再存在了?
我在这里假设您的意思是“创建一个对象并将对它的引用存储在一个弱属性中”。
在以变量为中心的视图中,具有 weak 属性的变量不会像具有 strong 属性的变量那样告诉 ARC 保留对象,而是监视引用的对象,当它消失时,它会将自己设置为 @ 987654326@.
如果您创建一个对象,只要在具有 strong 属性的变量中存储对它的引用,ARC 就会保留它。如果您对引用所做的只是将其存储在具有弱属性的变量中,则 ARC 不需要保留对象。
将变量视为上述参与者当然是一个类比,变量本身不是活动实体。实际上发生的是,在编译期间,编译器会插入执行上述变量操作的指令。结果是一样的。
TL;DR:strong 和 weak 是与 变量 相关联的属性,而不是与引用相关联的属性。考虑 变量 的生命周期以及其中存储的内容,以确定是否保留或删除任何对象。
HTH