NSAutoreleasepool和NSLog的奇怪问题

时间:2011-12-02 16:07:35

标签: iphone multithreading uitableview nslog nsautoreleasepool

如果我在代码中放置一个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 :(得分:0)

每当你有一个挂起/死锁时,你应该转储每个线程的调用堆栈以找出阻塞的内容。

要执行此操作,请将应用程序置于挂起状态,然后按“暂停”按钮(或从菜单中选择“产品”>“调试”>“暂停”)。然后,您将在左侧看到线程列表及其调用堆栈。展开每个线程以查看其调用堆栈。您还可以使用调试控制台中的以下命令之一来调用堆栈的文本表示形式(取决于您是使用gdb还是lldb进行调试):

  • t a bt(for gdb)
  • thread backtrace all(for lldb)

如果您需要更多帮助来诊断问题,请使用其中一个命令收集文本回溯并将其粘贴到评论中,以便我们查看。