것은이 문서화되지,하지만 대답은 OS X 10.9+ 및 iOS 7+에 예 것으로 보인다.
Objective-C 런타임은 open-source이므로 소스를 읽고 상황을 확인하십시오. 현재 스레드에서 풀없이 autorelease
을 수행하면 런타임의 최신 버전 (646, OS X 10.10 및 iOS 8과 함께 제공됨)이 실제로 풀을 추가합니다. NSObject.mm에서 : 첫 번째 풀을 누르면
static __attribute__((noinline))
id *autoreleaseNoPage(id obj)
{
// No pool in place.
assert(!hotPage());
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.
AutoreleasePoolPage *page = new AutoreleasePoolPage(nil);
setHotPage(page);
// Push an autorelease pool boundary if it wasn't already requested.
if (obj != POOL_SENTINEL) {
page->add(POOL_SENTINEL);
}
// Push the requested object.
return page->add(obj);
}
이 함수가 호출 (이 경우 일은 POOL_SENTINEL
입니다 밀), 또는 당신이없는 풀과 autorelease를. 첫 번째 풀이 푸시되면 autorelease 스택이 설정됩니다. 그러나 코드에서 볼 수 있듯이 DebugMissingPools
환경 변수가 설정되지 않은 경우 (기본적으로 설정되지 않음) autorelease가 풀없이 완료되면 autorelease 스택을 설정 한 다음 풀을 푸시합니다. POOL_SENTINEL
).
비슷하게 스레드가 파괴되어 스레드 로컬 저장소가 파괴 될 때 (다른 코드를 보지 않고 따르기는 조금 어렵지만 관련 부분입니다) autorelease 스택의 모든 것을 해제합니다 (즉, pop(0);
가하는 일입니다) 그래서 마지막 풀을 팝업으로 사용자에 의존하지 않습니다 또한
static void tls_dealloc(void *p)
{
// reinstate TLS value while we work
setHotPage((AutoreleasePoolPage *)p);
pop(0);
setHotPage(nil);
}
(X 10.9 및 iOS 7 OS와 함께 제공 551.1) 런타임의 이전 버전, 이 내용은 NSObject.mm에서 볼 수 있습니다.
static __attribute__((noinline))
id *autoreleaseSlow(id obj)
{
AutoreleasePoolPage *page;
page = hotPage();
// The code below assumes some cases are handled by autoreleaseFast()
assert(!page || page->full());
if (!page) {
// No pool. Silently push one.
assert(obj != POOL_SENTINEL);
if (DebugMissingPools) {
_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;
}
push();
page = hotPage();
}
do {
if (page->child) page = page->child;
else page = new AutoreleasePoolPage(page);
} while (page->full());
setHotPage(page);
return page->add(obj);
}
하지만 그 전의 버전 (OS X 10과 함께 제공된 532.2.8 및 iOS 6), does not :
static __attribute__((noinline))
id *autoreleaseSlow(id obj)
{
AutoreleasePoolPage *page;
page = hotPage();
// The code below assumes some cases are handled by autoreleaseFast()
assert(!page || page->full());
if (!page) {
assert(obj != POOL_SENTINEL);
_objc_inform("Object %p of class %s autoreleased "
"with no pool in place - just leaking - "
"break on objc_autoreleaseNoPool() to debug",
obj, object_getClassName(obj));
objc_autoreleaseNoPool(obj);
return NULL;
}
do {
if (page->child) page = page->child;
else page = new AutoreleasePoolPage(page);
} while (page->full());
setHotPage(page);
return page->add(obj);
}
참고 그 어떤 pthread
들에 대한 위의 작품뿐만 아니라 NSThread
의.
기본적으로 OS X 10.9 이상 또는 iOS 7 이상에서 실행중인 경우 풀이없는 스레드에서 자동 복구가 누출로 이어지지 않아야합니다. 이것은 문서화되지 않았기 때문에 내부 구현에 대한 세부 사항이므로 Apple이 향후 OS에서이를 변경할 수 있으므로주의해야합니다. 그러나, 단순히 자동 응답 풀이 작동하는 방식을 완전히 다시 작성하지 않는 한,이 기능이 간단하고 장점이 있으며 단점도없는 이유로이 기능을 제거하는 이유는 없습니다.
내 개체가 출시되는 것을 어떻게 말하고 있습니까? –
필요한 정보를 얻을 수 있습니까? –
왜냐하면 나는 "my"의 dealloc 메쏘드에 breakpoint를 가지고 있기 때문이다. – eliudnis