在 Objective C 中,如果一个 ViewController 有一个 UIKit 对象属性,我们就说一个 View ,并在 viewDidLoad 中实例化,然后将其添加到 subview 中,以便将其从内存中删除,removeFromSuperview() 和必须将对象设置为 nil (如果我没有记错的话,但我可能是......)
但是,在 Swift 中,只有具有可选类型的事物才能保留 nil 值。
我的问题是,如果我想在我的应用程序中为 UILabels 或 UIViews 之类的东西设置动画,然后让它们消失(对用户来说并从内存中删除),那么让 UIKit 对象removeFromSuperView() 就足够了吗?或者我是否必须将所有想要设置动画的对象设为可选,removeFromSuperView(),然后将它们设置为 nil?
我为我的表达能力不佳表示歉意。如果需要进一步说明,请告诉我。非常感谢您的投入。
最佳答案
如果您希望weak
属性对象解除分配,那么是的,您必须将它们设置为nil
或等待所属对象解除分配。
当父对象被释放时,非weak
属性中的对象将获得release
调用。这意味着如果没有其他东西保留对它们的引用,这些对象也将被释放。
如果您创建一个不是 View Controller 属性的临时 UILabel
并为其设置动画,然后 removeFromSuperview()
它,那么它也应该从内存中消失。
由于创建动画的函数运行时它被保留了(refcount: 1)
,后来被 View 层次结构(refcount: 2)
保留,函数结束了(refcount: 1)
,因此只有 View 层次结构保留它。如果您在动画结束时将其删除(refcount:0)
,它将被释放。
关于objective-c - 删除 View 、ARC、与 Objective C 和 Swift 的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42002411/