[iOS] Struct와 Class의 한판승부 - 1의 후속편
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))
CFGetRetainCount는 ARC의 참조 횟수를 리턴해주는 함수이고, Class in Class와 Struct in Class일때 어떤 결과가 나오는지 실험.
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
생각해보면 값타입은 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
그렇다.