Как сказал Билл, сначала я бы попытался создать пул авто-релиза для каждой итерации цикла, например:
for (NSString *part in partsOfLargeString) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString *trimmedPart = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSData *data = [trimmedPart dataUsingEncoding:NSUTF8StringEncoding];
…
[pool drain];
}
или, если вы используете достаточно свежий компилятор:
for (NSString *part in partsOfLargeString) {
@autoreleasepool {
NSString *trimmedPart = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSData *data = [trimmedPart dataUsingEncoding:NSUTF8StringEncoding];
…
}
}
Если это по-прежнему неприемлемо и вам нужно выпускать объекты более детально, вы можете использовать что-то вроде:
static inline __attribute__((ns_returns_retained))
id BICreateDrainedPoolObject(id (^expression)(void)) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
id object = expression();
[object retain];
[pool drain];
return object;
}
#define BIOBJ(expression) BICreateDrainedPoolObject(^{return (expression);})
, которое оценивает выражение, сохраняет его результат, освобождает все вспомогательные автоматически выпущенныевозражает и возвращает результат;а затем:
for (NSString *part in partsOfLargeString) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString *trimmedPart = BIOBJ([part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]);
NSData *data = BIOBJ([trimmedPart dataUsingEncoding:NSUTF8StringEncoding]);
[trimmedPart release];
// do something with data
[data release];
…
[pool drain];
}
Обратите внимание, что, поскольку функция возвращает сохраненный объект, вы отвечаете за его освобождение.Вы будете контролировать, когда это делать.
Не стесняйтесь выбирать лучшие имена для функции и макроса.Там могут быть некоторые угловые случаи, которые должны быть обработаны, но это должно работать для вашего конкретного примера.Предложения приветствуются!