iOS 메모리 관리 노트

2235 단어
iOS 메모리 관리의 원리는 인용계수이다. 인용계수는 하나의 메모리의 소유권을 통계하는 것이다. 이 메모리가 만들어지거나 다른 대상이나 바늘에 가리키면 인용계수는 +1이다.이후 메모리를 가지고 있지 않을 때 계수 -1을 인용한다.메모리의 인용 계수가 0이 되면 대상이나 바늘이 메모리를 가지고 있지 않다는 것을 의미하며 시스템은 메모리를 방출합니다.

MRC ARC


Objective-C에는 메모리의 수동 및 자동 관리에 대응하는 두 가지 메모리 관리 메커니즘인 MRC(Mannul Reference Counting)와 ARC(Automatic Reference Counting)가 제공됩니다.
  • MRC는 우리가 만들고 방출하는 코드를 추가하고 메모리를 사용자 정의로 관리하며 누가 방출하는지를 분배하는 원칙을 필요로 한다.
  • ARC의 본질은 사실 MRC이다. 시스템 컴파일링 기간은 적당한 곳에retain과release 등 코드를 추가하여 코드를 줄이는 동시에 메모리 오류 확률을 낮춘다.
  • 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

    좋은 웹페이지 즐겨찾기