Странная проблема с NSAutoreleasepool и NSLog - PullRequest
0 голосов
/ 02 декабря 2011

У меня странная проблема, которая решается, если я добавляю в код оператор NSLog. У меня есть UITableviewController с панелью поиска. Я делаю начальную выборку для заполнения таблицы следующим образом:

NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc]init];
  self.listContent = [MainFunctions populateArrayFromModel]; //Get the array populated here from the model data

  [pool2 release];

Внутри статического метода MainFunctions массив заполняется так:

NSMutableArray *resultArray = [[[NSMutableArray alloc] init] autorelease];
MModel *mainModel = [[MModel alloc] init];
//get all results from FetchedResultsController
[mainModel release];
return resultsArray;

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

Однако, если я добавлю несколько операторов NSLog в код, это будет работать последовательно. как ниже;

NSMutableArray *resultArray = [[[NSMutableArray alloc] init] autorelease];
           NSLog(@"1");

MModel *mainModel = [[MModel alloc] init];
//get all results from FetchedResultsController
           NSLog(@"2");
//....code here
           NSLog(@"3");
//....code here
           NSLog(@"4");


[mainModel release];
return resultsArray;

Я пытался снять и снова включить его, и он последовательно показывает то же самое поведение. При чем тут NSLog, я сбит с толку.

Цените любые указатели.

1 Ответ

0 голосов
/ 08 апреля 2012

Всякий раз, когда у вас есть зависание / тупик, вы должны сбросить стеки вызовов каждого потока, чтобы выяснить, что блокирует.

Для этого переведите ваше приложение в состояние зависания, а затем нажмите кнопку «Пауза» (или в меню «Продукт»> «Отладка»> «Пауза»). Вы увидите список потоков и их стеки вызовов слева. Разверните каждый поток, чтобы просмотреть его стек вызовов. Вы также можете текстовое представление стеков вызовов, используя одну из следующих команд в консоли отладки (в зависимости от того, отлаживаете ли вы gdb или lldb):

  • t a a bt (для gdb)
  • нить возвращает все (для lldb)

Если вам нужна дополнительная помощь в диагностике проблемы, соберите обратный текст, используя одну из этих команд, и вставьте его в комментарий, чтобы мы могли посмотреть.

...