2013-02-15 3 views
0

Я написал головоломку в Objective-C. Он использует первый поиск по ширине, чтобы исследовать состояния, доступные из начального состояния головоломки. Поиск прекращается, когда встречается первое состояние выигрыша. Единственная оптимизация - это справочная таблица, которая помогает предотвратить повторное исследование из состояния, которое уже было видно.Вопросы памяти для BFS в Objective-C

Алгоритм работает корректно. Однако профилирование показывает, что он использует много памяти, и я хотел бы понять, почему. Я думаю, что мой разрыв в понимании связан с циклом запуска Objective-C и пулом автозапуска.

Имеет ли следующий (упрощенный) код, позволяющий циклу выполнения завершить итерацию и слить пул авторесурсов?

- (void) search { 
    while (![myQueue empty]) { 
     State *state = [myQueue pop]; 
     for (State *s in [state allReachableStates]) { 
      [myQueue push:s]; 
     } 
    } 
} 

Профилирования показывает много памяти, используемые для NSArrays. Это имеет смысл, поскольку allReachableStates действительно создает множество массивов. Поскольку все они автореализованы, кажется возможным, что приведенный выше код препятствует сливу пула авторекламы.

Обратите внимание, что весь код запускается в основном потоке, и я не использую ARC.

Редактировать: Итак, исправление было обертыванием петли for в @autoreleasepool.

ответ

3

Вы правы, что пул авторефератов, связанный с этим ходом runloop, не будет слит в рамках этого метода. Он не будет истощен до некоторого времени после возвращения этого метода.

Вы можете обернуть блок то время как в @autoreleasepool самостоятельно (по одному для каждого состояния)

+0

Да, обертка части цикла while в '@ autoreleasepool' сделала трюк. Благодаря! – SundayMonday

Смежные вопросы