2016-07-19 5 views
0

런타임에 iOS에서을 키의 객체 주소로 사용하고 그 객체의 보유 개수를 값으로 유지합니다 (Kazuki Sakamoto와 Tomohiko Furumoto가 작성한 책에서).런타임시 iOS 검사에서 카운트 테이블을 보유 할 때

아래처럼 :

key(object's addr)  value(reference count) 

0x7fff59a7ba88   2 

0x7fa84b4b2c10   0 
... 

그리고 아이폰 OS 런타임이 일부 개체를 의미, 가치있는 모든 키가 0 인 있는지 확인하기 위해 테이블을 가끔를 확인할 것 공개해야한다, 다음 아이폰 OS는 키 - 값 쌍을 제거 할 것 테이블에서 호출하고 dealloc으로 호출하여 개체의 메모리를 해제합니다.

이 이론이 맞다면, 제 질문은 언제 어떤 주파수 시스템이 reference count hashtable을 검사 할 것인가라는 것입니다. 각 runloop? 또는 iOS는 테이블을 전혀 확인하지 않지만 자동으로 완료됩니다.

UPDATE :

난 그냥 ARC 또는 MRC와는 아무 상관이 없어야합니다 내 설명을 수정

, 그것은 런타임에 참조 카운팅에 대한 자세한 내용입니다.

+0

ARC처럼 들리지는 않지만 자동 복구 풀처럼 들립니다. – rmaddy

+0

@rmaddy 실제로 런타임시 ARC의 기본 메커니즘입니다. 그렇지 않으면 시스템이 각 객체의 보유 개수를 어떻게 추적합니까? 일부 데이터 구조의 어딘가에 보관 횟수를 저장하여 확인하고 작동 할 수 있어야합니다. 그것은 'ARC' 테이블을 사용하고 있지만 언제입니까? 그게 내 질문이다. – Boris

+0

아니요 보유 수 추적은 ARC와는 아무런 관련이 없습니다. 객체는 ARC보다 오래 유지됩니다. ARC가 추가하는 유일한 것은 컴파일러에 의해'retain'과'release' 호출의 자동 삽입입니다. ARC 및 MRC 코드는 런타임에 동일합니다. 객체의 보유 개수가 0이되면 할당 해제됩니다 (ARC 또는 MRC). – rmaddy

답변

0

그런 종류의 동작은 가비지 수집과 비슷하게 들리며 ARC가 작동하는 방식과 정확히 일치하지 않습니다.

ARC의 동작은 완전히 결정적입니다. ARC의 동작은 개체에 대한 strong 참조 수를 추적하고 개체 수가 0이되면 개체가 즉시 할당 취소됩니다. 구현 세부 사항 here에 대해 읽을 수 있습니다.

+0

컴파일하는 동안 ARC/MRC가하는 일을 이해하지만 iOS가 메모리 관리를 위해 런타임 중에 표면 아래에서 무엇을합니까? 사용 된 모든 메모리와 참조 횟수를 기록하는 테이블이 없습니까? 어쨌든'table' 것은 책에서 읽습니다. – Boris

+2

-release가 호출 될 때마다 런타임에서 참조 횟수를 확인합니다. 생각하고있는 것처럼 참조 횟수를 폴링하지 않습니다. – caughtinflux

+1

이 답변은 오해의 소지가 있습니다. ARC에만 국한된 것은 아닙니다. 이 설명은 MRC에도 똑같이 적용됩니다. – rmaddy