에 대한 weak_ptr를 구현 현재의 목표 - C (here 및 here 참조), 내가 확신 거기 shared_ptr
및 weak_ptr
의미 C++과 비슷한 무언가를 제공하는 라이브러리가 있어야에서 참조 횟수입니다 (포인터) 변수가 범위를 벗어 났을 때 자동으로 호출되어야하는 retain
과 release
에 대한 부수적 인 추가 호출 없이도shared_ptr의/구현하는 방법을 심하게주의해서 목적-C
ObjC에서 가능합니까? ObjC에는 소멸자가 없으므로 변수가 범위를 벗어날 때 자동으로 호출되는 방법이 없지만 이러한 retain
/release
호출이 실제로 필요한지 어떻게 알 수 있습니까? 내가 잘못 돌아가고 있니? 구현 방법 심하게주의해서
답변 해 주셔서 감사합니다. 문제는 변수가 힙에 할당되어 있기 때문에 범위를 벗어날 수 없다는 것입니다. 예 그렇지만 포인터 자체는 스택과 같습니다. 참조 추적 추적 ('release'에 의해 행해진)은 스택 포인터가 범위를 벗어날 때 호출되어야합니다. 죄송합니다. objC 메모리 관리 모델에 익숙하지 않다는 것을 알고 있지만 RAII 관용구가 가능한 언어에 대한 참조 계산 구현 경험이있는 사람이라면 비판을 공유해야합니다. – lurscher
@lurscher 예, 포인터가 스택에 있습니다.그러나 C (Objective-C가 빌드 된)에서 포인터는 단지 메모리 주소로 해석되는 숫자입니다. 그리고 RAII에 대한 나의 조잡한 이해에서 볼 때, 언어가 예외 기반 제어 흐름을 기반으로 만들어 졌기 때문에 그런 것처럼 보입니다. (소멸자가 실행되도록 보장) Objective-C *가 예외 기반 제어 흐름을 정말로 실망시키기 때문에 그럴 경우 문제가됩니다. 하지만 내가 말했듯이, ARC는 당신이 원하는 것을하기 위해 노력하는 컴파일러입니다. 그것은 정말 잘 작동합니다. –
나는 포인터가 값이라는 것을 알고 있지만, 컴파일러는 포인터 변수가 범위를 벗어날 때 릴리스 메시지를 추가하는 데 필요한 지식을 가지고 있으며 프로그래머에게 그 부담을 남겨두기 만합니다. 최악의 부분은 라이브러리 포인터 객체의 구현 세부 사항으로 제대로 숨길 수없는 부담 인 것 같습니다. 또한 RAII는 예외가 발생할 때 리소스를 해제하는 단순한 메커니즘보다 광범위합니다. 그러나 이는 현재의 질문의 범위를 벗어납니다. – lurscher