2012-01-14 1 views
12

나는 ARC를 공부하고있다. 그리고 약 포인터를 제로에 대해. OK 모든 기능을 이해했습니다. 약한 참조의 의미는 GC 시스템의 약한 참조와 동일하지만 Objective-C는 GC (특별한 경우 제외)를 사용하지 않으므로이 작동 방식을 이해할 수 없습니다.ARC의 약한 포인터 비헤이비어 구현 방법은 무엇입니까?

저는 약간 복잡한 사람입니다. 따라서 기본 구현 주체가 사용할 기능을 받아 들일 필요가 있습니다. 그러나 문제는 zeroing-weak 포인터의 원리를 설명하는 문서를 찾기가 매우 어렵다는 것입니다. (

IMO,이 작업을 수행하는 유일한 방법은 런타임시 자체를 참조하는 모든 포인터를 추적하고 유지하는 것입니다. nil 그 참조 카운트가 0가된다.하지만이 너무 무거운 바보 보이는 때. 내가 훨씬 더 나은 솔루션이 실제 ARC의 구현에 사용 믿습니다.

당신이 날은 문서를 찾을 수 있나요? 아니면 직접 설명을 더 좋은 것 도와 드릴까요!

답변

17

여기에 설명되어 있습니다.

http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

스포일러 : 그것은 꽤 많이 당신이 생각하는 것 어떻게 작동

. 모든 클래스는 포인터를 가리키는 약한 포인터의 주소 집합을 유지하며 dealloc이 호출되면 모두 0으로 설정합니다.

"추적"이 필요 없기 때문에 바보 같지만 ARC는 객체가 새로운 약한 참조에 할당 될 때마다 그 세트에 대한 포인터를 추가하는 코드를 삽입합니다.

실제로 가비지 수집과 관련된 속임수보다 훨씬 효율적입니다. 기본적으로 포인터를 찾고 백그라운드에서 가리키고있는 것을 유지하는 배경 스레드에서 힙을 통과해야합니다.

+2

사실, ARC에서 컴파일러는'objc_storeWeak' 및'objc_loadWeakRetain'과 같은 함수를 호출하는 코드를 내 보냅니다. 이 함수는 문서화 된 API입니다. http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime –

+0

예, 이러한 함수는 명시된 바와 같이 객체에 저장된 집합에서 weak 포인터를 추가하고 제거하는 방법입니다. "ARC는 객체가 새로운 약한 참조에 할당 될 때마다 그 세트에 대한 포인터를 추가하는 코드를 추가합니다"라고 말했을 때 –

+0

약한 포인터가 0 인 시점에서 객체의 참조 카운트가 떨어지는 지 알고 있습니까? 0으로 설정되거나 할당 해제 된 경우? 나는 참조 된 객체가 다시 사용되는 "할당"포인터로 문제가 발생했지만 참조 카운트가 0 사이로 떨어 졌기 때문에 여전히 dealloc이 호출되었습니다. 제로 - 약한 포인터로 해결할 수 있을지 궁금합니다. – fishinear