我对Objective-C中的不可变副本和可变副本感到困惑

时间:2015-12-17 09:13:37

标签: ios swift subviews

奇怪的是,没有命令一次删除所有视图的子视图。但是,一个 view的子视图数组是内部子视图列表的不可变副本,因此它是合法的 循环浏览并逐个删除每个子视图:

for v in myView.subviews as [UIView] {
    v.removeFromSuperview()
 }

此内容在编程IOS 8 中,如果副本是不可变副本,为什么可以更改?

2 个答案:

答案 0 :(得分:5)

我不认为你真的在这里询问不可变数组,因为你没有在数组本身上调用任何方法,所以它的可变性不是问题。 subviews数组的immutable属性是视图决定将列表呈现给 you 的方式。它与子视图如何与父视图交互无关。

您似乎对为什么子视图可以从父视图中删除而您不能这样做感到困惑;这只是因为子视图是UIView - 子类,而父视图是UIView - 子类,因此子视图可以访问父级的所有内部变量,并且可以执行任何它喜欢的操作父母。你不能。这是故意的,因为您不知道视图层次结构的复杂性(并且不希望),UIView显然在哪里。

您发布的代码的另一个有趣的方面是,当您枚举它时,经常在数组中获取一个元素以从数组中删除它将导致异常。在这种特殊情况下,您从视图中收到的subviews数组是原始的copy(不可变副本),因此获取子视图以从父视图中删除自身不会影响此数组并且列举不会动摇。感谢克里斯托弗凯文豪威尔指出这一点,因为我完全错过了它,第一次。

答案 1 :(得分:1)

子视图数组是不可变的,因此您无法更改它。例如,您不能自己删除数组中的元素,也不能用全新的数组覆盖它。

然而,没有什么能阻止类的内部实现通过在内部覆盖它来改变它。

但在这种情况下,返回的subviews数组是实际子视图数组的副本。