NSAutoreleasepool 和 NSLog 的奇怪问题

Posted

技术标签:

【中文标题】NSAutoreleasepool 和 NSLog 的奇怪问题【英文标题】:Strange issue with NSAutoreleasepool and NSLog 【发布时间】:2011-12-02 16:07:35 【问题描述】:

我有一个奇怪的问题,如果我在代码中添加一个 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和这有什么关系,我很困惑。

感谢任何指针。

【问题讨论】:

NSLog 创建自动发布的字符串?如果你使用 NSMutableArray *resultArray = [NSMutableArray array]; 会发生什么 【参考方案1】:

每当您遇到挂起/死锁时,您应该转储每个线程的调用堆栈以找出阻塞的原因。

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

t a a bt(用于 gdb) 线程回溯所有(用于 lldb)

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

【讨论】:

以上是关于NSAutoreleasepool 和 NSLog 的奇怪问题的主要内容,如果未能解决你的问题,请参考以下文章

NSAutoreleasePool 和 @autoreleasepool 块有啥区别?

目标 C - NSthread 和 NSAutoreleasePool?

使用 NSAutoreleasePool 和 NSURLConnection

在没有 NSAutoReleasePool 的情况下使用 autoReleased 对象?

NSRunLoop 和 NSAutoreleasePool,它们是如何交互的?

Objective C NSAutoreleasePool 和发布