我正在研究别人设计的应用程序。该应用程序充满了这样的调用:
[NSThread detachNewThreadSelector:@selector(loadPhotoImage) toTarget:self withObject:nil];
和
DownloadPhotoThread *thread = [[DownloadPhotoThread alloc] initWithFriendArray:_friendsList delegate:self];
[self.arrDownloadThreads addObject:thread];
[thread start];
而且我会随机进入整个用户界面锁定且手机/模拟器不再响应触摸的情况。请注意,该设备永远不会解冻。如果我在调试会话期间遇到暂停,则看到线程坐在开始行或detachNewThreadSelector上。
今天,当这些锁定发生时,我能够缩小范围。我刚刚添加了Zendesk表单控制器(可在此处找到:https://github.com/zendesk/zendesk_ios_sdk/blob/master/DropboxSampleApp/FormViewController.m)
其中具有以下代码:
- (void) textViewDidChange:(UITextView *)textView
{
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row > 1) {
CGSize s = [description sizeThatFits:CGSizeMake(description.frame.size.width, 10000)];
float dh = MAX(s.height, 115);
description.frame = CGRectMake(description.frame.origin.x,
description.frame.origin.y,
description.frame.size.width,
dh);
return dh;
}
return 44.0;
}
我可以通过键入一个字符轻松地重现锁定条件,然后一遍又一遍地返回此文本框。 (这将调整表格视图的高度)
在某些情况下,我可以通过如下方式通过使用dispatch_async()块包装违规者来防止锁定情况:
DownloadPhotoThread *thread = [[DownloadPhotoThread alloc] initWithFriendArray:_friendsList delegate:self];
[self.arrDownloadThreads addObject:thread];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[thread start];
});
但是在其他情况下,我不能这样做,因为有问题的代码位于复杂的库中,例如ASIHTTPRequest或XMPPFramework。您对这里到底发生了什么有任何建议吗?
另一件事。在这种情况下,我遇到暂停时,这就是主线程说的话:
Thread 1
com.apple.main-thread
0 objc_msgSend
....
25 UIApplicationMain
26 main
暂停和取消暂停将始终在objc_msgSend内部的某些汇编指令中找到main。
感谢您的帮助,因为我在这里很受困扰。
最佳答案
事实证明,崩溃是由https://github.com/zendesk/zendesk_ios_sdk/中的错误引起的。我已提出拉取请求,并提交给他们进行审查。