为什么在Swift中不需要new
关键字?
在Java或C#等其他语言中,new
是为每个新对象分配内存所必需的。
实施例
(Foo) foo = new Foo()
然而,在快速,它的
(var) foo = Foo()
如果Swift内置了垃圾收集/内存分配,则new
是隐式的,或者它根本就不使用。如果是后者,为什么/什么取代它?
答案 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
之间的交互。