2016-03-31 35 views
2

newキーワードはSwiftでは不要なのはなぜですか?Swiftに「new」キーワードが必要ないのはなぜですか?

JavaやC#などの他の言語では、新しいオブジェクトごとにメモリを割り当てるのに、newが必要です。 Ex。スウィフトがガベージコレクション/メモリ割り当てに内蔵されている場合は

(Foo) foo = new Foo() 

は、しかし迅速に、それは

(var) foo = Foo() 

だ、new暗黙的である、またはそれは単に使用されていません。後者の場合、それはなぜ/何で置き換えられますか?それへの最後の「強い」参照が消えたときに、メモリが割り当て解除されるのではなくdeleteへの明示的な呼び出しを必要とする:ヒープ割り当て/参照型(class ES)の場合

+0

Swiftは[自動参照カウント](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)を使用しています。 –

+0

ちょうどその素早いコンパイラがjava/c#より賢いです、それは私たちがしたいことを認識します –

答えて

1

は、スウィフトは自動リファレンスを数える利用しています。 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

大量のコードを読みやすく、 "新しい"キーワードで洞察力のあるロジックを得るのは簡単です: - / –

関連する問題