iOS 메모리 관리 노트
MRC ARC
Objective-C에는 메모리의 수동 및 자동 관리에 대응하는 두 가지 메모리 관리 메커니즘인 MRC(Mannul Reference Counting)와 ARC(Automatic Reference Counting)가 제공됩니다.
MRC
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString* str = [[[NSString alloc] initWithString:@"test"] autorelease];
//use str...
[pool release];
//str is released
release autoRelease
release는 실례적인 방법으로 대상만 호출할 수 있으며 대상의 메모리 공간의 인용 계수를 1로 줄이는 역할을 한다. 인용 계수가 0이 되면 시스템은 즉시 이 메모리를 방출한다.
autorelease도 하나의 실례적인 방법으로 대상만 호출할 수 있으며, 이것은release와 유사하지만, 즉각 1을 줄이는 것이 아니라, 지연된release에 해당하며, 보통 방법 반환값의 방출에 사용된다.
그렇다면 autoRelease 대상은 도대체 언제 풀려날까요?
모든 autorelease의 대상은 작용역을 벗어나면 최근에 만든 자동 방출 탱크에 자동으로 추가됩니다.완전한 운행 순환이 끝나기 전에 소각된다.
관계: (스레드-RunLoop-AutoRelease Pool-AutoRelease)
autorelease 대상은 현재runloop 교체가 끝났을 때 방출되는데 방출할 수 있는 이유는 시스템이 모든runloop 교체에 자동 방출 탱크 Push와 Pop을 넣었기 때문이다.autoReleasePool은 단독 구조가 없고 autoReleasePoolPage 양방향 체인 테이블이 있습니다.대상에게 - autorelease 메시지를 보내면 현재 AutoreleasePoolPage의 창고 맨 위에 있는 넥스트 바늘이 가리키는 위치에 이 대상을 추가합니다.
void *context = objc_autoreleasePoolPush();
// {}
objc_autoreleasePoolPop(context);
AutoRelease Pool
우리는 시스템 자동 방출 탱크가runloop 교체가 끝날 때 autorelease 대상을 방출하는 것을 알고 있지만 방출 시기를 바꾸기 위해pool은 본질적으로 하나의 Stack으로 pool에 던진 대상은 입고와 같다.우리는 제때에 방출해야 하는 코드 블록을 우리가 생성한 autorelease pool에 넣고 끝난 후에 이 사용자 정의 pool을 비우고 주동적으로 pool을 비워 메모리를 제때에 방출하는 목적을 달성한다.
AutoreleasePool은 어떤 상황에서 프로그램의 메모리 점용을 대폭 낮출 수 있다(NSOperation 메모리 유출 문제를 사용자 정의할 수 있다. 순환 처리에서 순환체 안의 대상은 모두 임시로 만들어서 사용하는 상황 etc이다).
키워드
지난번에Property에서 말했듯이 이것은 ivta+접근 방법입니다.이러한 메모리 관리 키워드(strong,weak,assign,retain,copy,mutablecopy) 시스템은 어떻게 우리가 처리하는 구덩이를 도와줍니까
ARC 프로젝트에서 MRC 파일에 컴파일 옵션 - fno-objc-arc의 표식을 추가하여 컴파일 문제를 해결할 수 있습니다.
sunnnyxx 흑막 뒤에 Autorelease
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.