2012-10-12 4 views
1

부스트 C++에서 weak 포인터는 공유 (참조 계산 된) 포인터에 대한 관찰자로 구현됩니다.__weak 속성에 런타임 지원이 필요한 이유

어떻게 객관적인 -c에서 구현되며, 왜 런타임 지원이 필요합니까? (컴파일러 지원 외에 iOS 5 이상은 weak 참조를 사용해야 함)

+1

효과적으로; C++은 런타임을 사용합니다. 매우 복잡한 것입니다. 컴파일러라고합니다. – bbum

답변

3

std :: weak_ptr에는 실제로 책 관리 데이터와 참조 된 개체를 포함하는 공유 데이터 구조에 대한 포인터가 들어 있습니다. 참조 된 객체가 파괴되면이 공유 된 데이터가 보관되어 weak_ptrs가 객체가 사라 졌음을 나타내는 서적 데이터를 볼 수 있고 weak_ptrs 자체는 참조 된 객체가 할당 해제 될 때 수정할 필요가 없습니다.

Objective-C 약한 참조에서 책 관리 데이터가있는 중간 개체를 가리 키지 않습니다. 그것들은 실제 참조 된 객체를 가리키는 일반 포인터이거나 참조 된 객체가 사라지면 nil이된다. 모든 __weak 포인터는 코드의 다른 일부가 객체에 대한 마지막 비 weak 포인터를 해제 할 때 업데이트되어야합니다. 이를 위해서는 런타임 지원이 필요합니다.

즉, Obj-C 약한 포인터는 보통 컴파일러 마술 (런타임 지원을 사용하는)이 있지만, shared_ptrs 및 weak_ptrs는 자체 런타임 지원을 구현하는 래퍼 (smart pointer ' 생성자, 할당 연산자, 소멸자 등)에 대한 포인터를 생성합니다.

3

Objective-C 약한 참조는 자신이 가리키는 객체가 할당 해제되면 nil으로 설정됩니다. 이 방법은 참조주기를 풀고 할당 취소 된 객체에 메시지를 보내지 않아도되므로 매우 편리하지만 런타임에서 객체에 대한 모든 약한 참조를 추적해야하며 객체가 최종 할당 해제 될 때 런타임에서 해당 참조를 제외하지 않아야합니다.

두 가지 모두 Objective-C 런타임에서만 투명하게 수행 할 수 있습니다. Objective-C는 C++이 자신의 코드에서 이런 종류의 마법을 구현하는 것과 동일한 유연성을 가지고 있지 않습니다.

관련 문제