각 스레드 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.