删除视图、ARC、与 Objective C 和 Swift 的差异
Removing views, ARC, differences from Objective C and Swift
在Objective C中,如果一个ViewController有一个UIKit对象属性,就说一个视图,在viewDidLoad中实例化,然后添加到子视图中,在为了将它从内存中删除,必须完成 removeFromSuperview() 和将对象设置为 nil(如果我没记错的话,但我可能...)
然而,在Swift中,只有可选类型的东西才能持有零值。
我的问题是,如果我想在我的应用程序中为 UILabels 或 UIViews 之类的东西设置动画,然后让它们消失(对用户而言并从内存中删除),将 UIKit 对象设置为 removeFromSuperView() 是足够?或者我是否必须让所有我试图制作动画的对象成为可选的,removeFromSuperView() 然后将它们设置为 nil?
我为我的口齿不清道歉。如果需要进一步说明,请告诉我。非常感谢您的意见。
如果您希望 weak
属性 对象解除分配,那么是的,您必须将它们设置为 nil
或等待拥有对象解除分配。
非 weak
属性中的对象将在释放父对象时获得 release
调用。这意味着如果没有其他对象保留对它们的引用,这些对象也将被释放。
如果您创建一个临时的 UILabel
不是视图控制器的 属性 并为其设置动画然后 removeFromSuperview()
它,那么它也应该从内存中消失。
因为它在创建动画的函数 运行 时被保留 (refcount: 1)
,后来由视图层次结构 (refcount: 2)
,函数结束 (refcount: 1)
,所以只有视图层次结构保留了它。如果你在动画结束时移除它 (refcount: 0)
它被释放。
在Objective C中,如果一个ViewController有一个UIKit对象属性,就说一个视图,在viewDidLoad中实例化,然后添加到子视图中,在为了将它从内存中删除,必须完成 removeFromSuperview() 和将对象设置为 nil(如果我没记错的话,但我可能...)
然而,在Swift中,只有可选类型的东西才能持有零值。
我的问题是,如果我想在我的应用程序中为 UILabels 或 UIViews 之类的东西设置动画,然后让它们消失(对用户而言并从内存中删除),将 UIKit 对象设置为 removeFromSuperView() 是足够?或者我是否必须让所有我试图制作动画的对象成为可选的,removeFromSuperView() 然后将它们设置为 nil?
我为我的口齿不清道歉。如果需要进一步说明,请告诉我。非常感谢您的意见。
如果您希望 weak
属性 对象解除分配,那么是的,您必须将它们设置为 nil
或等待拥有对象解除分配。
非 weak
属性中的对象将在释放父对象时获得 release
调用。这意味着如果没有其他对象保留对它们的引用,这些对象也将被释放。
如果您创建一个临时的 UILabel
不是视图控制器的 属性 并为其设置动画然后 removeFromSuperview()
它,那么它也应该从内存中消失。
因为它在创建动画的函数 运行 时被保留 (refcount: 1)
,后来由视图层次结构 (refcount: 2)
,函数结束 (refcount: 1)
,所以只有视图层次结构保留了它。如果你在动画结束时移除它 (refcount: 0)
它被释放。