删除视图,ARC,与Objective C和Swift的差异

时间:2017-02-02 12:33:16

标签: objective-c swift automatic-ref-counting

在Objective C中,如果一个ViewController有一个UIKit对象属性,让我们只说一个视图,并在viewDidLoad中实例化,然后被添加到子视图中,为了将其从内存中删除,同时removeFromSuperview()和将对象设置为nil必须完成(如果我没有弄错,但我可以......)

但是,在Swift中,只有具有可选类型的东西才能保存nil值。

我的问题是,如果我想在我的应用程序中为UILabels或UIViews制作动画,然后让它们消失(对用户和从内存中移除),那么UIKit对象是removeFromSuperView()就足够了吗?或者我是否必须制作我试图设置可选动画的所有对象,removeFromSuperView()然后将它们设置为nil?

我为我糟糕的表达道歉。如果需要进一步说明,请告诉我。非常感谢您的投入。

1 个答案:

答案 0 :(得分:3)

如果您希望weak属性对象取消分配,则是,您必须将它们设置为nil或等待拥有对象取消分配。

取消分配父对象时,非weak属性中的对象将获得release调用。这意味着如果没有其他东西保留对它们的引用,对象也将被释放。

如果您创建的临时UILabel不是视图控制器的属性并为其设置动画,然后removeFromSuperview()它,那么它也应该从内存中消失。

当创建动画的函数正在运行时保留(refcount: 1),稍后由视图层次结构(refcount: 2)保留(refcount: 1),函数结束(refcount: 0),因此只有视图层次结构保留它。如果您在动画import unittest from collections import Counter dic1 = {'key': [1, 2]} dic2 = {'key': [2, 1]} dic3 = {'key': [1, 3]} class TestExample (unittest.TestCase): def countize_dict(self, d): return {k:Counter(v) for k, v in d.items()} def assertDictEqualCountized(self, d1, d2): self.assertDictEqual(self.countize_dict(d1), self.countize_dict(d2)) def test_dicEqual(self): self.assertDictEqualCountized(dic1, dic2) def test_other_dic_equal(self): self.assertDictEqualCountized(dic1, dic3) tester = TestExample() tester.test_dicEqual() # pass tester.test_other_dic_equal() # fail AssertionError: {'key': Counter({1: 1, 2: 1})} != {'key': Counter({1: 1, 3: 1})} - {'key': Counter({1: 1, 2: 1})} ? ^ + {'key': Counter({1: 1, 3: 1})} ? ^ 结束时将其删除,则会将其取消分配。

相关问题