2017-03-18 10 views
0

私は、クラスタイプがSwiftのリファレンスタイプであることを研究しました。Swift 3リファレンスタイプとメモリ管理

ので、例えば、私は次の文があります、++

SomeDefinedClass *ptrA = new SomeDefinedClass(10, 10); 
SomeDefinedClass *ptrB = new SomeDefinedClass(30, 30); 
// (ptrA->x, ptrA->y) == (10, 10) 
// (ptrB->x, ptrB->y) == (30, 30) 

ptrB = ptrA; 
ptrB->x = 50; 
ptrB->y = 50; 
// (ptrA->x, ptrA->y) == (50, 50) due to both ptrA and ptrB 
// point to the same object in the memory 

しかし、Cでポインタ代入のこの種:

class Rectangle { 
    var x: Int 
    var y: Int 
} 

var a = Rectangle(x: 10, y: 10) 
var b = Rectangle(x: 30, y: 30) 
// (a.x, a.y) == (10, 10) and (b.x, b.y) == (30, 30) 

b = a 
b.x = 50 
b.y = 50 
// (a.x, a.y) == (50, 50) due to both instance a and b 
// refer to the same piece in the memory 

私は、この動作は、例えば、C++のポインタに似ていると思います(= PTRA ptrB)は

delete ptrB; 

Bなし メモリリークを引き起こす可能性がEFORE

ptrB = ptrA; 

私が学んチュートリアルでは、これを言及 が、私は次のようにスウィフトは、いくつかの動作を行うことができるとは思わなかった「ptrBを削除します。」自動的に 私はこれを処理する必要はありません、右か?

答えて

0

スウィフトは、オブジェクトが現在持っている参照の数を追跡し、カウントがゼロに達するとメモリを解放する自動参照カウント(ARC)という技術を使用します。 b = aを迅速に実行すると、参照番号がbになり、参照カウントがゼロになります。 Swiftはそれがゼロであるとみなして削除します。だからこそ、delete自分で迅速にする必要はありません。 ARCの詳細については、hereをご覧ください。

C++と比較したい場合は、いいえ、生のポインタのようには機能しません。代わりに、C++ 11のスマートポインタstd::shared_ptrのように動作します。

+0

ありがとうございます! – Nestarneal