swift에서는 코드를 작성할 때 성능에 영향을 주는 요소가 크게 3가지가 있다.
스택이 관리되는 방식은 매우 빠르고 간단하다. 만약 POP을 할 경우 실제로 메모리를 삭제하는 것이 아니라 포인터를 감소시킨다. PUSH가 된다면 포인터를 증가시키고 해당 메모리 위치에 값을 덮어씌운다.

콜 스택 : 함수가 호출되면 그 함수의'스택 프레임'이 스택의 가장 위에 생성(PUSH)된다. 함수의 실행이 끝나면 스택에서 해제(POP)된다.스택 프레임 : 매개변수, 리턴주소, 로컬 변수Heap 메모리에 할당하게 되면 오버헤드(성능 부하)가 있다. ① 런타임에 메모리를 할당하기 위해 Heap 메모리에서 할당되지 않은 빈 메모리 블럭을 찾아내야 한다. 이러한 과정에서 Heap의 여러 쓰레드가 접근 할 수 있는 특성 때문에 Race Condition이 발생 할 수 있다. 그렇기 때문에 ② 무결성을 위해 순차적으로 접근하도록 locking과 같은 병행제어를 해야한다.
// Class 예시
class Point {
var x, y: Double
func draw() { ... }
}
let point1 = Point(x: 0, y: 0)
let point2 = point1
poinrt2.x = 5

클래스의 인스턴스가 Heap에 저장될 때는 추가적으로 2워드의 공간이 더 필요하다.
2워드type 필드 : 실제 Type을 저장하는 이유 - 상속이 가능하기 때문(다형성)refCount 필드 : 카운트가 0이 되면 Heap을 lock하고 반환 
💡타입을 저장하는 사례 : UICollectionView의 register에서 첫 번째 매개변수로 AnyClass라는 타입이 사용됨

AnyClass는 Type 이라는 타입. 타입을 저장 할 수 있다.
Swift에서는 Heap에 저장된 인스턴스의 참조 카운트가 0이 될 경우 메모리 할당을 해제하며, 이러한 작업은 빈번하게 이루어진다.
Struct라고 하더라도 참조 카운팅을 안하는 것은 아니다. 예를 들면 Struct의 프로퍼티의 타입이 Class 타입이거나 String 타입이라면 참조 카운팅이 발생할 수 있다.