Index: src/OFString+JSONValue.m ================================================================== --- src/OFString+JSONValue.m +++ src/OFString+JSONValue.m @@ -652,10 +652,11 @@ return [self JSONValueWithDepthLimit: 32]; } - (id)JSONValueWithDepthLimit: (size_t)depthLimit { + void *pool = objc_autoreleasePoolPush(); const char *pointer = [self UTF8String]; const char *stop = pointer + [self UTF8StringLength]; id object; size_t line = 1; @@ -664,8 +665,12 @@ if (pointer < stop || object == nil) @throw [OFInvalidJSONException exceptionWithString: self line: line]; - return object; + [object retain]; + + objc_autoreleasePoolPop(pool); + + return [object autorelease]; } @end Index: src/OFString+URLEncoding.m ================================================================== --- src/OFString+URLEncoding.m +++ src/OFString+URLEncoding.m @@ -29,10 +29,11 @@ int _OFString_URLEncoding_reference; @implementation OFString (URLEncoding) - (OFString*)stringByURLEncoding { + void *pool = objc_autoreleasePoolPush(); const char *string = [self UTF8String]; char *retCString; size_t i; OFString *ret; @@ -68,10 +69,12 @@ retCString[i++] = (low > 9 ? low - 10 + 'A' : low + '0'); } } + objc_autoreleasePoolPop(pool); + @try { ret = [OFString stringWithUTF8String: retCString length: i]; } @finally { free(retCString); @@ -80,10 +83,11 @@ return ret; } - (OFString*)stringByURLDecoding { + void *pool = objc_autoreleasePoolPush(); OFString *ret; const char *string = [self UTF8String]; char *retCString; char byte = 0; int state = 0; @@ -126,10 +130,12 @@ break; } } retCString[i] = '\0'; + + objc_autoreleasePoolPop(pool); if (state != 0) { free(retCString); @throw [OFInvalidFormatException exception]; } Index: src/OFString+XMLEscaping.m ================================================================== --- src/OFString+XMLEscaping.m +++ src/OFString+XMLEscaping.m @@ -27,10 +27,11 @@ int _OFString_XMLEscaping_reference; @implementation OFString (XMLEscaping) - (OFString*)stringByXMLEscaping { + void *pool = objc_autoreleasePoolPush(); char *retCString; const char *string, *append; size_t length, retLength, appendLen; size_t i, j; OFString *ret; @@ -95,12 +96,13 @@ memcpy(retCString + j, append, appendLen); j += appendLen; } else retCString[j++] = string[i]; } - assert(j == retLength); + + objc_autoreleasePoolPop(pool); @try { ret = [OFString stringWithUTF8String: retCString length: retLength]; } @finally { Index: src/OFString+XMLUnescaping.m ================================================================== --- src/OFString+XMLUnescaping.m +++ src/OFString+XMLUnescaping.m @@ -74,20 +74,23 @@ static OFString* parseEntities(OFString *self, id (*lookup)(void*, OFString*, OFString*), void *context) { + OFMutableString *ret; + void *pool; const char *string; size_t i, last, length; bool inEntity; - OFMutableString *ret; + + ret = [OFMutableString string]; + + pool = objc_autoreleasePoolPush(); string = [self UTF8String]; length = [self UTF8StringLength]; - ret = [OFMutableString string]; - last = 0; inEntity = false; for (i = 0; i < length; i++) { if (!inEntity && string[i] == '&') { @@ -167,10 +170,12 @@ [ret appendUTF8String: string + last length: i - last]; [ret makeImmutable]; + + objc_autoreleasePoolPop(pool); return ret; } static id