Я следую принятому ответу m.kocikowski и немного изменил его, чтобы использовать автозапуск для очистки всех временных строк, созданных stringByReplacingCharactersInRange
В комментарии к этому методу говорится: / * Заменить символы в диапазоне указанной строкой, возвращая новую строку.
* /
Таким образом, в зависимости от длины вашего XML, вы можете создавать огромную кучу новых строк автоматического выпуска, которые не очищаются до конца следующего @autoreleasepool. Если вы не уверены, когда это может произойти, или если пользовательское действие могло неоднократно вызывать много вызовов этого метода раньше, тогда вы можете просто обернуть это в @autoreleasepool. Они могут даже быть вложенными и использоваться внутри циклов, где это возможно.
Ссылка Apple на @autoreleasepool гласит следующее ... "Если вы пишете цикл, который создает много временных объектов. Вы можете использовать блок пула автоматического освобождения внутри цикла, чтобы избавиться от этих объектов перед следующей итерацией. Использование блока пула автоматического выпуска в цикле помогает уменьшить максимальный объем памяти приложения ». Я не использовал его в цикле, но теперь, по крайней мере, этот метод убирает за собой.
- (NSString *) stringByStrippingHTML {
NSString *retVal;
@autoreleasepool {
NSRange r;
NSString *s = [[self copy] autorelease];
while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound) {
s = [s stringByReplacingCharactersInRange:r withString:@""];
}
retVal = [s copy];
}
// pool is drained, release s and all temp
// strings created by stringByReplacingCharactersInRange
return retVal;
}