From 4f51f9cd05f90e4b212de1e6c34d1e948481ab0f Mon Sep 17 00:00:00 2001 From: theraven Date: Thu, 5 Apr 2012 16:37:48 +0000 Subject: [PATCH] When using the runtime's internal autorelease pool implementation, just pop the top object off when attempting to retain an autoreleased return value, --- arc.m | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/arc.m b/arc.m index 272f594..62ec738 100644 --- a/arc.m +++ b/arc.m @@ -303,12 +303,15 @@ id objc_autorelease(id obj) id objc_autoreleaseReturnValue(id obj) { - struct arc_tls* tls = getARCThreadData(); - if (NULL != tls) + if (!useARCAutoreleasePool) { - objc_autorelease(tls->returnRetained); - tls->returnRetained = obj; - return obj; + struct arc_tls* tls = getARCThreadData(); + if (NULL != tls) + { + objc_autorelease(tls->returnRetained); + tls->returnRetained = obj; + return obj; + } } return objc_autorelease(obj); } @@ -326,7 +329,17 @@ id objc_retainAutoreleasedReturnValue(id obj) struct arc_tls* tls = getARCThreadData(); if (NULL != tls) { - if (obj == tls->returnRetained) + // If we're using our own autorelease pool, just pop the object from the top + if (useARCAutoreleasePool) + { + if ((NULL != tls->pool) && + (*(tls->pool->insert-1) == obj)) + { + tls->pool->insert--; + return obj; + } + } + else if (obj == tls->returnRetained) { tls->returnRetained = NULL; return obj;