Swift에서 클래스 객체의 메모리(RAM의 힙 영역) 주소와 크기를 얻어보자. 실무에서는 주소를 이용해서 클래스 객체가 복제되었는지 아닌지를 판단할 수 있을 것이다.
ObjectIdentifier(_:)
또는 passUnretained(_:).toOpaque()
를 이용해서 클래스 객체의 메모리 주소를 얻을 수 있다. 아래의 코드는 함수(printAddress
) 안에 클래스 객체를 전달한 후에도 그 메모리 위치가 함수 밖에서의 객체 메모리 위치와 같음을 확인하는 코드다.
class MyClass {
var x: Int
var y: String
init(x: Int, y: String) {
self.x = x
self.y = y
}
}
func printAddress(myObject: MyClass) {
let unmanagedObject = Unmanaged.passUnretained(myObject)
let address = unmanagedObject.toOpaque()
print("address in func: \(address)")
let objectIdentifier = ObjectIdentifier(myObject)
print("objectIdentifier in func: \(objectIdentifier)")
}
let obj = MyClass(x: 3, y: "a")
let unmanagedObject = Unmanaged.passUnretained(obj)
let address = unmanagedObject.toOpaque()
print("global address: \(address)")
let objectIdentifier = ObjectIdentifier(obj)
print("global objectIdentifier: \(objectIdentifier)")
printAddress(myObject: obj)
출력 결과는 아래와 같다.
global address: 0x00006000027e42a0
global objectIdentifier: ObjectIdentifier(0x00006000027e42a0)
address in func: 0x00006000027e42a0
objectIdentifier in func: ObjectIdentifier(0x00006000027e42a0)
Program ended with exit code: 0
클래스의 프로퍼티 중 컬렉션 타입의 프로퍼티는 클래스의 인스턴스에 주소만 저장된다. 예컨대 [Int]
타입의 어레이 프로퍼티가 있다고 하자. 클래스의 인스턴스에는 어레이를 가리키는 주소만이 저장되므로 클래스의 인스턴스 크기와 어레이의 길이는 서로 관련이 없다.
참고할 만한 링크: https://stackoverflow.com/questions/40312123/get-the-size-in-bytes-of-an-object-on-the-heap