iOS 메모리 관리 에서 인용 계수 학습
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++실 현 된 클래스 입 니 다.클래스 구 조 는 그림 과 같 습 니 다.
코코아 프레임 워 크 에서 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 의 유효한 컴 파일 방법 은 다음 과 같 습 니 다.
애플 은 대상 의 인용 수 를 보 는 방법 을 제공 하지만 이 함수 들 이 제공 하 는 인용 수 치 를 완전히 신뢰 할 수 는 없다.풀 려 난 대상 의 1 급 부정 확 한 대상 주소 에 대해 서 는'1'로 되 돌아 가기 도 합 니 다.다 중 스 레 드 에 서 는 경쟁 조건 에 문제 가 있 기 때문에 얻 은 수 치 는 믿 을 수 없습니다.
[object retainCount]; // object , MRC
_objc_rootRetainCount(obj); //MRC ARC
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.