2017-03-18 1 views
0

Ich habe studiert, dass Klassentyp ist Referenztyp in Swift.Swift 3 Referenztyp und Speicherverwaltung

So zum Beispiel, ich habe folgende Aussagen:

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 

Ich denke, dieses Verhalten zu C++ 's Zeiger ähnlich ist, zum Beispiel:

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 

Aber in C++, diese Art von Zeigerzuweisung (PTRB = PTRA) Speicherverlust ohne

delete ptrB; 

b verursachen können efore

ptrB = ptrA; 

Das Tutorial ich das nicht erwähnt, untersucht, aber ich denke, Swift kann ein bestimmtes Verhalten tun wie „löschen PTRB;“ automatisch, also muss ich nicht damit umgehen, oder?

Antwort

0

Swift verwendet eine Technik namens ARC (Automatic Reference Counting), die die Anzahl der Referenzen eines Objekts überwacht und den Speicher freigibt, wenn die Anzahl Null erreicht. Wenn Sie b = a in Swift ausführen, erreicht die Referenzzählung von b auf Null, vorausgesetzt, es gibt keinen anderen Verweis darauf. Swift sieht, dass es Null ist und lösche es. Deshalb brauchst du dich nicht in delete in swift. Sie können mehr über ARC von here erfahren.

Wenn Sie es mit C++ vergleichen möchten, dann, Nein, es funktioniert nicht wie rohe Zeiger. Stattdessen funktioniert es eher wie der intelligente Zeiger von C++ 11 std::shared_ptr.

+0

Vielen Dank! – Nestarneal