Цикл выполнения для вторичного потока моего приложения ниже.
Имеет вложенные циклы управления.
- Внешний цикл работает в течение всего срока действия приложения
- Внутренний цикл выполняется, когда открыто одно представление, затем поток ожидает, пока представление не открыто.
- Проходы по внутренней петле короткие, доли секунды.
Мой код не оставляет заведомо автоматически выпущенные объекты в невыпущенных пулах, но я не знаю, что делает ОС.
В основном потоке какао оборачивает пул авто-релиза вокруг каждого прохода цикла выполнения.
В этом вторичном потоке я считаю, что ближайший эквивалент - это проход через внутренний цикл.
Внутренний пул автоматического высвобождения охватывает каждый проход через внутренний цикл.
Пул middle обернут вокруг внутреннего цикла, поэтому объекты, созданные и автоматически выпущенные на этом уровне, не будут удерживаться до завершения работы приложения.
внешний пул охватывает весь цикл выполнения.
Как я могу определить, какое влияние создание и выпуск всех этих пулов оказывает на скорость моего кода.
Как определить, необходимы ли все три пула или нет?
код и пояснение:
- (void)processLoop
{
NSAutoreleasePool * outerPool = [[NSAutoreleasePool alloc] init];
[processCondition lock];
//outer loop
//this loop runs until my application exits
while (![[NSThread currentThread] isCancelled])
{
NSAutoreleasePool *middlePool = [[NSAutoreleasePool alloc];
if(processGo)
{
//inner loop
//this loop runs typically for a few seconds
while (processGo && ![[NSThread currentThread] isCancelled])
{
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc]; init];
//within inner loop
//this takes a fraction of a second
[self doSomething];
[innerPool release];
}
[self tidyThingsUp];
}
else
{
[processCondition wait];
}
[middlePool release];
}
[processCondition unlock];
[outerPool release];
}
комбинация:
- внутренний цикл while
- NSCondition * processCondition
- переключение
processGo
между YES
и NO
позволяет мне останавливать и запускать внутренний цикл while, не отменяя поток.
if (processGo == YES)
выполнение входит во внутренний цикл while.
Когда основной поток устанавливает
processGo = NO
выполнение оставляет внутренний цикл while и приводит в порядок
при следующем проходе внешнего цикла выполнение достигает
[processCondition wait]
и ждет
, если основной поток сбрасывается
processGo == YES
и звонки
[processCondition wait]
выполнение снова входит во внутренний цикл