简单的澄清对象Swift语言

时间:2014-12-06 19:51:09

标签: ios object memory swift uiview

我对一些我可能误解的问题有一个非常简单的问题。

我有两个UIViews" A"和" B"。如果我写:

let A = UIView() // Or something else
let B = A

然后我改变B的属性(例如框架),A的属性也会改变吗?

我虽然没有,但我正在制作一个视图,所以我有了初始视图和最终视图。我创建了一个这样的过渡视图:

let transitionView = finalView

然后我更改了transitionView的属性,例如标签的位置。

当我在动画结尾添加最终视图时,标签位于新位置。

为什么?感谢

2 个答案:

答案 0 :(得分:2)

因为B和A 两个视图。它们是对同一个UIView对象的引用。

反过来,这是因为类实例在Swift中作为引用类型传递。

现在请点击此处查看关于此主题的小文章:https://stackoverflow.com/a/27366050/341994

答案 1 :(得分:2)

在swift类型中分为两大类:

  • 参考类型
  • 值类型

类是引用类型;结构(包括数组和字典),基本数据类型(int,float,string等)和枚举都是值类型。

值类型始终按值传递,这意味着在分配给变量或传递给函数/方法时,会创建原始数据的副本。这个规则有一个例外:函数/方法可以在值类型参数上使用inout修饰符来通过引用传递它。

请注意,编译器和运行时通常会进行优化,因此除非严格需要,否则不会始终创建副本 - 重要的是我们作为开发人员知道我们正在处理副本而不是原始数据。 / p>

引用类型始终通过引用传递,这意味着在将其分配给变量或将其传递给函数/方法时,将分配/传递对数据的引用而不是数据本身。

UIView是一个类,因此在创建实例时,将其分配给变量,然后将该变量分配给另一个变量,对实例的引用而不是实例本身的引用。两个变量都指向相同的UIView实例。对引用该实例的所有变量都可以看到对该实例所做的任何更改。

建议阅读:Classes and Structures