2016-03-31 230 views
2

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

在诸如Java或C#的其他语言中,为每个新对象分配内存都需要使用new。例如,

(Foo) foo = new Foo() 

然而,在迅速,它的

(var) foo = Foo() 

如果斯威夫特已建成垃圾收集/内存分配中,是new隐式的,或者是根本就没有使用。如果后者,为什么/取而代之?

+0

Swift使用[自动引用计数](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)。 –

+0

这就是swift编译器比java/c#更聪明,它可以识别我们想要做什么 –

回答

1

对于堆分配/引用类型(class ES),斯威夫特利用自动引用计数:而不是要求到delete显式调用,当最后一个“强”引用消失的内存被释放。 var foo = Foo()let foo = Foo()分配并初始化Foo类的实例,并创建一个强引用它的局部变量。当这个变量超出范围时,如果没有其他引用已经被创建,则该对象被解除分配。

The Swift Programming Language

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

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

你也可以阅读有关initialization sequence,即在一个类层次结构属性和定制init S之间的相互作用。

3

new只是一个语言结构,说我想初始化并创建一个新的Foo。如果编译器足够聪明以确定这是你想要从上下文中做的事情,为什么要详细说明它呢?底线是,有真正的功能没有差异:

[[Foo alloc] init] - Objective C 
[Foo new] - Objective C 
new Foo() - C/C++/Java 
Foo() - Swift 

还要注意的是,在C++中,你可以使用以下方法来生成一个基于堆栈的对象:

Foo foo(); 

ARC,引用计数,垃圾回收,显式删除,都只是回收不再需要的对象所使用的内存的机制,并且确实不会影响创建对象所需的语言语法。

不要挂在语法上,学会识别结构和操作,然后将语法附加到结构上,并且你有90%的知道每种编程语言的方法。

+1

易于阅读大量的代码并通过“new”关键字获得富有洞察力的逻辑: - / –

相关问题