iOS 메모리 관리 에서 인용 계수 학습

1.계산 을 인용 하 는 사고방식
  • 자신 이 생 성 한 대상,자신 이 소지
  • 자신 이 생 성 한 대상 이 아니 라 자신 도 가 질 수 있다
  • 자신 이 가 진 대상 이 필요 할 때 석방 하지 않 는 다
  • 자신 이 가지 고 있 지 않 은 대상 은 석방 할 수 없다.
  • 2.인용 계수 의 실현
    1.alloc 방법
    
    + alloc
    + allocWithZone:
    class_creatInstance
    calloc
    alloc 방법 을 호출 하려 면 먼저 allocWithZone:클래스 방법 을 호출 한 다음 classcreatInstance 함수,마지막 으로 calloc 를 호출 하여 메모리 블록 을 분배 합 니 다.
    2.ratainCount/retain/release 방법
    
    - retainCount
    __CFDoExternRefOperation
    CFBasicHashGetCountOfKey
    
    - retain
    __CFDoExternRefOperation
    CFBasicHashAddValue
    
    -retainCount
    __CFDoExternRefOperation
    CFBasicHashRemoveValue //CFBasicHashRemoveValue  0 ,-release  dealloc
    모든 방법 이 같은 를 통 해CFDoExternRefOperation 함 수 는 일련의 이름 이 비슷 한 함 수 를 호출 합 니 다.또한 함수 명 에서 보 듯 이 애플 은 산 목록(참조 계수 표)을 사용 하여 인용 수 를 관리 하고 표 키 값 은 메모리 블록 주소 의 해시 값 입 니 다.그러나 GNUStep 은 인용 계 수 를 대상 이 메모리 블록 머리 를 차지 하 는 변수 에 저장 합 니 다(obbclayot 이 구조 체 중).
    메모리 블록 헤드 관리 인용 계수 의 장점:
  • 소량의 코드 를 완성 할 수 있 습 니 다
  • 참조 메모리 블록 과 대상 메모리 블록 을 통일 적 으로 관리 할 수 있 습 니 다.
  • 인용 기술 표 관리 인용 계수 의 장점:
    1.대상 메모리 의 빠 른 분 배 는 메모리 블록 헤드 를 고려 할 필요 가 없습니다.
    참조 계수 표 각 기록 에 메모리 블록 주소 가 저장 되 어 있 으 며,각 기록 에서 각 메모리 블록 으로 거 슬러 올 라 갈 수 있 습 니 다.
    두 번 째 특징 은 디 버 깅 할 때 매우 중요 합 니 다.고장 이 나 서 대상 이 사용 하 는 메모리 블록 이 손상 되 더 라 도 인용 계수 표 가 손상 되 지 않 았 다 면 각 메모리 블록 의 주 소 를 확인 할 수 있 습 니 다.
    3.autorelease 방법
    NSAutoreleasePool 은 AutoreleasePoolPage 를 결점 으로 하 는 양 방향 링크 를 통 해 이 루어 집 니 다.Autorelease PoolPage 는 C++실 현 된 클래스 입 니 다.클래스 구 조 는 그림 과 같 습 니 다.
  • magic 은 AutoreleasePoolPage 의 구조 가 완전 한 지 검증 하 는 데 사 용 됩 니 다.
  • next 는 최근 에 추 가 된 autorelease 대상 의 다음 위 치 를 가리 키 며 초기 화 할 때 begin()을 가리 킵 니 다.
  • thread 는 현재 스 레 드 를 가리 키 고 있 습 니 다.
  • parent 는 부모 노드 를 가리 키 고 첫 번 째 노드 의 parent 값 은 nil 입 니 다.
  • child 는 하위 노드 를 가리 키 고 마지막 노드 의 child 값 은 nil 입 니 다.
  • depth 는 깊이 를 나타 내 고 0 부터 뒤로 1 증가 합 니 다.
  • hiwat 는 high water mark 를 대표 합 니 다.
  • Autorelease PoolPage 는 대상 마다 4096 바이트 메모리(즉 가상 메모리 한 페이지 의 크기)를 열 고 인 스 턴 스 변수 가 차지 하 는 공간 을 제외 하고 나머지 공간 은 모두 autorelease 대상 의 주 소 를 저장 합 니 다.메모리 구성:

    코코아 프레임 워 크 에서 NSRunloop 이 순환 할 때마다 NSAutoreleasePool 대상 이 생 성 되 거나 폐기 된다.autorelease 대상 이 대량으로 생 성 될 때 NSAutoreleasePool 을 폐기 하지 않 으 면 생 성 된 대상 이 방출 되 지 않 으 며,이 경우 메모리 부족 현상 이 발생 할 수 있 으 므 로 NSAutoreleasePool 을 적 절 히 생 성,보유,폐기 할 필요 가 있다.보통 Objective-C 를 사용 합 니 다.어떤 대상 의 autorelease/retain 방법 을 호출 하 든 구현 상 NSObject 류 의 autorelease/retain 인 스 턴 스 방법 을 호출 하지만 NSAutoreleasePool 류 에 대해 서 는 autorelease/retain 인 스 턴 스 방법 이 재 작성 되 어 실행 중 오류 가 발생 할 수 있 습 니 다(exception).autorelease 는 실제로 대상 의 석방 시 기 를 NSAutoreleasePool 관리 에 맡 기 고 사용 방법 은 다음 과 같다.
    NSAutoreleasePool 대상 을 생 성하 고 보유 합 니 다.
    
    NSAutoreleasePool *pool = [NSAutoreleasePool alloc] init]; //     objc_autoreleasePoolPush()
    분 배 된 대상 의 autorelease 인 스 턴 스 방법 을 호출 합 니 다.
    
    id obj = [NSObject alloc] init];
    [obj autorelease]; //     objc_autorelease()obj
    NSAutoreleasPool 대상 을 폐기 합 니 다.
    
    [pool drain]; //     objc_autoreleasePoolPop(pool)
    4.ARC 설명
    ARC(Automatic Reference Counting)는 컴 파일 단계 에서 retain/release 를 자동 으로 만 들 었 으 며,인용 계 수 를 수 동 으로 추가 해 야 했 던 코드 는 자동 으로 컴 파일 러 가 완성 할 수 있다.ARC 는 GC 가 아 닙 니 다.실행 시 메모리 관리 가 아 닙 니 다.malloc/freee 작업 을 하지 않 습 니 다.코드 정적 분석(Static Analyzer)도구 일 뿐 같은 프로그램 에서 파일 단위 로 ARC 의 유효 와 무 효 를 선택 할 수 있 습 니 다.Core Foundation 의 malloc()나 free()등 은 스스로 메모리 관 리 를 수 동 으로 해 야 합 니 다.ARC 의 유효한 컴 파일 방법 은 다음 과 같 습 니 다.
  • clang(LLVM 컴 파일 러)3.0 이상 버 전 을 사용 합 니 다.
  • 컴 파일 러 속성 을'-fobc-arc'로 지정 합 니 다.
  • 3.인용 계수 보기
    애플 은 대상 의 인용 수 를 보 는 방법 을 제공 하지만 이 함수 들 이 제공 하 는 인용 수 치 를 완전히 신뢰 할 수 는 없다.풀 려 난 대상 의 1 급 부정 확 한 대상 주소 에 대해 서 는'1'로 되 돌아 가기 도 합 니 다.다 중 스 레 드 에 서 는 경쟁 조건 에 문제 가 있 기 때문에 얻 은 수 치 는 믿 을 수 없습니다.
    
    [object retainCount]; //  object     ,        MRC
     _objc_rootRetainCount(obj); //MRC ARC   

    좋은 웹페이지 즐겨찾기