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 对象?