为什么"新" Swift中没有必要使用关键字?

时间:2016-03-31 04:39:14

标签: swift

为什么在Swift中不需要new关键字?

在Java或C#等其他语言中,new是为每个新对象分配内存所必需的。 实施例

(Foo) foo = new Foo()

然而,在快速,它的

(var) foo = Foo()

如果Swift内置了垃圾收集/内存分配,则new是隐式的,或者它根本就不使用。如果是后者,为什么/什么取代它?

2 个答案:

答案 0 :(得分:3)

new只是一种语言结构,表示我想初始化并创建一个新的Foo。如果编译器足够聪明,可以从上下文中确定您想要做什么,为什么要对它进行详细说明呢?底线是:

之间确实没有功能差异
[[Foo alloc] init] - Objective C
[Foo new] - Objective C
new Foo() - C/C++/Java
Foo() - Swift

另请注意,在C ++中,您可以使用以下内容生成基于堆栈的对象:

Foo foo();

ARC,引用计数,垃圾收集,显式删除,都是回收不再需要的对象所使用的内存的机制,并且实际上与首先创建对象所需的语言语法无关。 / p>

不要挂断语法,学会识别构造和操作,然后将语法附加到构造中,而且你知道每种编程语言都有90%的方法。

答案 1 :(得分:1)

对于堆分配/引用类型(class es),​​Swift利用自动引用计数:而不是要求显式调用delete,内存在最后一次被释放对它的“强烈”提及消失了。 var foo = Foo()let foo = Foo()分配并初始化Foo类的实例,并创建一个具有强引用的局部变量。当此变量超出范围时,如果未进行其他引用,则取消分配该对象。

来自The Swift Programming Language

  

每次创建类的新实例时,ARC都会分配一块内存来存储有关该实例的信息。此内存保存有关实例类型的信息,以及与该实例关联的任何存储属性的值。

     

此外,当不再需要实例时,ARC会释放该实例使用的内存,以便将内存用于其他目的。这可以确保类实例在不再需要时不会占用内存空间。

您还可以阅读initialization sequence,即类层次结构中属性与自定义init之间的交互。