Swift 언어: 클래스 객체의 RAM 주소와 크기 얻기

Wonil Lee·2023년 12월 28일
0

개요

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

profile
DEV WITH APPLE

0개의 댓글