2012-05-27 2 views
-1

에 대한 weak_ptr를 구현 현재의 목표 - C (herehere 참조), 내가 확신 거기 shared_ptrweak_ptr 의미 C++과 비슷한 무언가를 제공하는 라이브러리가 있어야에서 참조 횟수입니다 (포인터) 변수가 범위를 벗어 났을 때 자동으로 호출되어야하는 retainrelease에 대한 부수적 인 추가 호출 없이도shared_ptr의/구현하는 방법을 심하게주의해서 목적-C

ObjC에서 가능합니까? ObjC에는 소멸자가 없으므로 변수가 범위를 벗어날 때 자동으로 호출되는 방법이 없지만 이러한 retain/release 호출이 실제로 필요한지 어떻게 알 수 있습니까? 내가 잘못 돌아가고 있니? 구현 방법 심하게주의해서

답변

2

이것은 ARC가 처리했습니다. ARC 이외의 다른 방법은 실제로 좋은 방법이 아닙니다. C++에서는 스택 객체가 있고 할당 (=) 및 참조 (->)를 오버로드 할 수 있습니다. 둘 다 공유 포인터에 필요합니다. Niether는 객관적인 C 언어로 할 수 있습니다.

9

내가 그와 함께 문제를 가지고

... 현재 목표 - C에서 참조 횟수입니다. 이 아니며이 잘못 구현되었습니다. 에 익숙하지 않다면입니다. I 당신이 알아야 할 몇 가지 규칙 만 있기 때문에 정말 간단하다고 생각합니다. 그것이 당신에게 익숙하지 않기 때문에 그것을 두드리지 마십시오.

ObjC에서 가능합니까?

예, 가능합니다. 이를 ARC (Automatic Reference Counting)라고합니다. 자세한 내용은 "Transitioning to ARC Release Notes"을 참조하십시오.

내가 ObjC이 소멸자 사실

이없는 것을 알고는 않습니다. 그게 -dealloc 방법입니다.

... 변수는 오브젝티브 C에 대해 이해하는

것은 범위를 벗어난 이동 객체 만 힙에 할당 할 수 있기 때문에 객체이 범위를 벗어나하지 않는다는 것입니다 (< 복사되지 않은 블록에 대해서는 여기에 일반주의 사항을 삽입하십시오 >). 객체 (즉, 변수)에 대한 포인터는 범위를 벗어날 수 있지만 객체 자체는 항상 범위에 있습니다. 왜냐하면 힙은 기술적으로 전역 범위로 간주되기 때문입니다. (그것은 당신이 물체의 주소를 잃어 버렸을 때, 그것을 다시 찾을 수 없기 때문에 가깝습니다)

+0

답변 해 주셔서 감사합니다. 문제는 변수가 힙에 할당되어 있기 때문에 범위를 벗어날 수 없다는 것입니다. 예 그렇지만 포인터 자체는 스택과 같습니다. 참조 추적 추적 ('release'에 의해 행해진)은 스택 포인터가 범위를 벗어날 때 호출되어야합니다. 죄송합니다. objC 메모리 관리 모델에 익숙하지 않다는 것을 알고 있지만 RAII 관용구가 가능한 언어에 대한 참조 계산 구현 경험이있는 사람이라면 비판을 공유해야합니다. – lurscher

+1

@lurscher 예, 포인터가 스택에 있습니다.그러나 C (Objective-C가 빌드 된)에서 포인터는 단지 메모리 주소로 해석되는 숫자입니다. 그리고 RAII에 대한 나의 조잡한 이해에서 볼 때, 언어가 예외 기반 제어 흐름을 기반으로 만들어 졌기 때문에 그런 것처럼 보입니다. (소멸자가 실행되도록 보장) Objective-C *가 예외 기반 제어 흐름을 정말로 실망시키기 때문에 그럴 경우 문제가됩니다. 하지만 내가 말했듯이, ARC는 당신이 원하는 것을하기 위해 노력하는 컴파일러입니다. 그것은 정말 잘 작동합니다. –

+0

나는 포인터가 값이라는 것을 알고 있지만, 컴파일러는 포인터 변수가 범위를 벗어날 때 릴리스 메시지를 추가하는 데 필요한 지식을 가지고 있으며 프로그래머에게 그 부담을 남겨두기 만합니다. 최악의 부분은 라이브러리 포인터 객체의 구현 세부 사항으로 제대로 숨길 수없는 부담 인 것 같습니다. 또한 RAII는 예외가 발생할 때 리소스를 해제하는 단순한 메커니즘보다 광범위합니다. 그러나 이는 현재의 질문의 범위를 벗어납니다. – lurscher

관련 문제