[Objective-C] 런타임에서 동작하는 과정.

2024. 5. 2. 03:50🍏/Objective-C

 

https://namu.wiki/w/Objective-C

Objective-C는 동적 언어의 특성을 가지고 있어 런타임 시에 많은 동작들이 수행됩니다. 이러한 동적 특성은 런타임 시 객체의 타입을 확인하거나 변경할 수 있게 하며, 메소드를 동적으로 호출하거나 교체하는 것도 가능하게 합니다.

Objective-C의 런타임 시스템은 아래와 같은 과정을 거치게됩니다.

1. 클래스와 객체의 동적 생성

Objective-C에서는 런타임 시 클래스를 생성하고 수정할 수 있습니다. 예를 들어, `NSClassFromString()` 함수를 사용하여 문자열 이름으로 클래스의 인스턴스를 생성할 수 있습니다. 또한, 클래스에 새로운 메소드를 추가하거나 기존 메소드를 교체하는 것도 가능합니다.

2. 메소드 호출의 동적 결정

Objective-C 메소드 호출은 컴파일 타임이 아닌 런타임에 결정됩니다. 이를 **동적 메소드 디스패치(Dynamic Method Dispatch)**라고 합니다. 메소드를 호출할 때, 메소드 이름에 해당하는 셀렉터(Selector)를 사용하여 실제 함수 주소를 메소드 디스패치 테이블에서 검색합니다. 이 과정은 `objc_msgSend` 함수를 통해 처리됩니다.

3. 메시지 전달(Message Passing)

Objective-C에서 객체에 메시지를 보내는 것은 메소드를 호출하는 것을 의미합니다. 이 메시지 전달 시스템은 런타임에 객체의 클래스를 확인하고 해당 클래스의 메소드 리스트에서 적절한 메소드를 찾아 실행합니다. 만약 메소드를 찾지 못하면, `forwardInvocation:` 같은 메소드를 사용하여 메시지를 다른 객체로 전달하거나 처리할 수 있습니다.

4. 타입 검사와 캐스팅

런타임 시에 객체의 타입을 확인하고, 객체가 특정 클래스의 인스턴스인지 확인할 수 있습니다. `isKindOfClass:`와 `isMemberOfClass:` 메소드를 사용하여 이러한 검사를 수행할 수 있습니다. 또한, `dynamic_cast`를 사용하여 타입 안전성을 확인하면서 객체 타입을 캐스팅할 수 있습니다.

5. 프로퍼티와 KVO

런타임에서 프로퍼티의 getter와 setter 메소드를 자동으로 생성하고, Key-Value Observing (KVO)를 통해 프로퍼티의 변경을 감시할 수 있습니다. 객체의 프로퍼티가 변경될 때, 관찰자에게 자동으로 알림이 발송되며, 이는 런타임에서 동적으로 처리됩니다.

Objective-C의 런타임 시스템은 이러한 동적 특성을 통해 매우 유연하고 강력한 프로그래밍이 가능하도록 지원합니다. 그러나 이러한 동적 특성 때문에 성능이 저하될 수 있으므로, 성능이 중요한 부분에서는 이를 고려해야 합니다.

'🍏 > Objective-C' 카테고리의 다른 글

Cocoa와 Objective-C  (0) 2023.08.12