2017-03-18 5 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++의 포인터와 유사하다 생각

delete ptrB; 

B 않고 메모리 누출을 일으킬 수있다 (ptrB는 ptrA를 =)

ptrB = ptrA; 

는 efore 내가 공부 튜토리얼이, 언급하지 않았다하지만 스위프트가 같은 몇 가지 행동을 할 수 있다고 생각 "ptrB 삭제를;" 자동으로 이 작업을 처리 할 필요가 없습니다.

답변

0

스위프트는 개체가 현재 가지고있는 참조 수를 추적하고 카운트가 0에 도달 할 때 메모리를 할당 해제하는 ARC (Automatic Reference Counting)라는 기술을 사용합니다. b = a을 신속하게 수행 할 때 참조 번호가 b 인 경우 0 참조로 간주됩니다. 다른 참조가 없다고 가정합니다. Swift는 그것이 0이라고보고 그것을 삭제합니다. 그렇기 때문에 delete을 신속하게 처리 할 필요가 없습니다. ARC에 대한 자세한 내용은 here에서 확인할 수 있습니다.

C++과 비교하고 싶으면 아니오, 원시 포인터처럼 작동하지 않습니다. 대신 C++ 11의 스마트 포인터 std::shared_ptr처럼 작동합니다.

+0

대단히 감사합니다. – Nestarneal