각 스레드 Autorelease 객체의 메모리 관리

3102 단어
최근에 Bestswifter,kuailejim와 모의면접을 실시한 후에 응시생이든 2, 3년을 일한 고급 엔지니어든 모두 아래의 몇 가지 문제에 대해 어리둥절했다. 아마도 개발에 많이 쓰이지 않았을 것이다. 여기서 얕은 토론을 통해
  • Autoreleasepool과 Runloop의 관계
  • ARC에서 Autoreleasepool이 관리하는 객체 유형
  • 서브루틴은 기본적으로 Runloop을 열지 않습니다. Autorelease 대상이 나타나면 어떻게 처리합니까?수동으로 처리하지 않으면 메모리가 유출됩니까?

  • 첫 번째 문제에 대해 이해하기 쉽다. 다음과 같이 볼 수 있다. ibireme의 깊은 이해 RunLoop, 메인 라인은 기본적으로 Runloop을 열어준다. Runloop은 자동으로 Autoreleasepool을 만들고 Push, Pop 등 조작을 해서 메모리 관리를 한다.
    두 번째 질문, ARC에서 어떤 대상을 Autoreleasepool이 관리합니까?대다수의 대답은'pool이 관리한다'는 것이다.사실은 그렇지 않습니다. 일반적인 대상에 대해서는 컴파일러가 적당한 곳에서 Realease를 제공해 줍니다.이 문제에 대해 나는 이미 정리한 적이 있다. 인용계수가 가져온 토론은 고전적인 이라는 책을 참고한 것이다.
    세 번째 질문에 대답하기 어려울 것 같아서 런타임, Autoreleasepool의 원본 코드를 꼼꼼하게 읽어야 합니다.저도 Stack Over Flow의 대답을 참고했습니다. Does NSThread create autoreleasepool automaticly now?다시 한 번 간단하게 설명하자면, 하위 라인에서 Pool을 만들면 발생하는 Autorelease 대상은 Pool에 맡겨 관리할 것이다.Pool을 만들지 않았지만 Autorelease 대상이 생기면 autorelease NoPage 방법을 사용합니다.이 방법에서 자동으로 hotpage(hotPage는 현재 사용 중인 AutoreleasePoolPage로 이해할 수 있습니다. 만약 당신이 이해하지 못한다면 먼저 Autoreleasepool의 원본 코드를 보고 이 문제를 보십시오)를 호출page->add(obj)하여 대상을 AutoreleasePoolPage 창고에 추가합니다. 즉, 수동적인 메모리 관리를 하지 않아도 메모리가 유출되지 않습니다!Stack OverFlow의 저자도 OS X 10.9+와 iOS 7+가 들어간 특성이라고 말했다.그리고 애플은 이에 대응하는 공식 문서가 없지만 원본 코드를 통해 알 수 있다.소스 코드의 일부를 게시합니다.
    static __attribute__((noinline))
    id *autoreleaseNoPage(id obj)
    {
        // No pool in place.
        // hotPage   AutoreleasePoolPage。
        assert(!hotPage());
    
        // POOL_SENTINEL   nil  
        if (obj != POOL_SENTINEL  &&  DebugMissingPools) {
            // We are pushing an object with no pool in place, 
            // and no-pool debugging was requested by environment.
            _objc_inform("MISSING POOLS: Object %p of class %s "
                         "autoreleased with no pool in place - "
                         "just leaking - break on "
                         "objc_autoreleaseNoPool() to debug", 
                         (void*)obj, object_getClassName(obj));
            objc_autoreleaseNoPool(obj);
            return nil;
        }
    
        // Install the first page.
        //   hotpage(hotPage   AutoreleasePoolPage
        AutoreleasePoolPage *page = new AutoreleasePoolPage(nil);
        setHotPage(page);
    
        // Push an autorelease pool boundary if it wasn't already requested.
        // POOL_SENTINEL   nil  , 
        if (obj != POOL_SENTINEL) {
            page->add(POOL_SENTINEL);
        }
    
        // Push the requested object.
        //      
        return page->add(obj);
    }

    Reference

  • 자동 방출 탱크의 전생----Autoreleasepool
  • 깊이 분석
  • 인용계수가 가져온 토론
  • does NSThread create autoreleasepool automaticly now?
  • 좋은 웹페이지 즐겨찾기