[iOS] Struct와 Class의 한판승부 - 2

유인호·2024년 4월 10일
0

iOS

목록 보기
40/64

[iOS] Struct와 Class의 한판승부 - 1의 후속편

0. 실험 코드

class ClassInClass {
	let a = TestClass()
	let b = TestClass()
	let c = TestClass()
	let d = TestClass()
}

struct StructInClass {
	let a = TestClass()
	let b = TestClass()
	let c = TestClass()
	let d = TestClass()
}

let classA = ClassInClass()
let classB = classA
let classC = classB
let classD = classC

let structA = StructInClass()
let structB = structA
let structC = structB
let structD = structC

print(CFGetRetainCount(classA))
print(CFGetRetainCount(classA.a))
print(CFGetRetainCount(structA.a))

1. 설명

CFGetRetainCount는 ARC의 참조 횟수를 리턴해주는 함수이고, Class in Class와 Struct in Class일때 어떤 결과가 나오는지 실험.

2. 결과

classA: 5
classA.a: 2
structA.a: 5

Class를 복사하면 주소를 복사한다. 그래서 Class는 A, B, C, D 전부 같은 녀석이라고 보면 된다.
그러나 Struct를 복사하면 주소가 아닌 값 그 자체를 복사하게 되어서, struct A, B, C, D 전부 다른 녀석이다.

그래서 Struct들에 들어가 있는 class 인스턴스들은 전부 다른 녀석이 인스턴스를 갖고 있는게 되어서, 4+1인 5가 나오고, Class들에 들어가 있는 인스턴스들은 1+1인 1이 나오게 되었다.

왜 1씩 더 나오는지 의문이 있긴 했는데, 어느정도 다들 비슷한 생각을 하고 있는것 같았다.
[iOS] CFGetRetainCount

3. 자매품

생각해보면 값타입은 CoW가 있지 않은가? Struct의 경우 CoW가 구현되어 있지 않아 5가 나왔지만, Array같은거면 Class랑 똑같은 결과가 나올까?

let arrayA = [StructInClass()]
let arrayB = arrayA
let arrayC = arrayB
let arrayD = arrayC

print(CFGetRetainCount(arrayA[0].a))

arrayA[0].a : 2

그렇다.

profile
🍎Apple Developer Academy @ POSTECH 2nd, 🌱SeSAC iOS 4th

0개의 댓글