IOS只是冻结
我的代码中有一个非常讨厌的bug,使应用程序没有响应。它没有崩溃,只是让一切都没有反应,我需要重新启动应用程序,让它重新工作 有相当多的人报告过这个问题,但我自己从未遇到过,这使得调试非常困难。我也不能复制它。 然而,今天早上我终于把它冻住了。这次我没有对这个应用做任何特别的事情。我点击“暂停程序执行”按钮获得堆栈跟踪(见下文) 我不太确定堆栈跟踪是否与问题有关,但我会发布它 你有过类似的问题吗?如何调试这样的东西? 如有任何建议,将不胜感激 谢谢 以下是我所做的几件可能是原因: 计时器 大量的动画:IOS只是冻结,ios,objective-c,queue,grand-central-dispatch,Ios,Objective C,Queue,Grand Central Dispatch,我的代码中有一个非常讨厌的bug,使应用程序没有响应。它没有崩溃,只是让一切都没有反应,我需要重新启动应用程序,让它重新工作 有相当多的人报告过这个问题,但我自己从未遇到过,这使得调试非常困难。我也不能复制它。 然而,今天早上我终于把它冻住了。这次我没有对这个应用做任何特别的事情。我点击“暂停程序执行”按钮获得堆栈跟踪(见下文) 我不太确定堆栈跟踪是否与问题有关,但我会发布它 你有过类似的问题吗?如何调试这样的东西? 如有任何建议,将不胜感激 谢谢 以下是我所做的几件可能是原因: 计时器 大量的
[UIView animateWithDuration:0.15f delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseOut animations:^{
//Animations in here
} completion:nil];
游戏中心回调,并使用dispatch\u async获取主队列
- (void)getMatchData:(void(^)(NSData *matchData))block {
__weak GameViewController *weakSelf = self;
[self.gkMatch loadMatchDataWithCompletionHandler:^(NSData *matchData, NSError *error) {
//Handle data
if (block)
block(matchData);
}];
}
//In another function
[self getMatchData:^(NSData *matchData) {
dispatch_async(dispatch_get_main_queue(), ^{
//Do stuff with data
});
}];
频繁使用块、操作队列和GCD,但请确保我没有在调度异步块中使用调度同步来创建死锁
还可以在同一视图上使用UIPangestureRecognitor和UIApgestureRecognitor来移动它
堆栈跟踪意味着您将向响应程序发出某种事件,例如当UIButton调用其目标上的选择器时。最后一个让它“冻结”的UI元素是什么?它关联的选择器是什么?这不是一个常规的“未识别的选择器发送到实例”吗?您在控制台中有关于异常的详细信息吗?好的,现在在您对该对象的调用中及其周围设置一些断点,看看它是否阻塞了主线程。动画从来不是原因,它们通常在专用队列上执行;NSTimer通常不会阻塞runloop,因为它们紧密集成在runloop中。看起来AH是通过某种委托方法向您回调的,您没有实现这种方法。不过,这不会“冻结”一个应用程序,这只是一个致命的例外。@Ben-G,是的,它是一个无法识别的选择器,但我宁愿诊断根本原因。我想应用程序确实崩溃了——当它作为发布版本运行时?
- (void)getMatchData:(void(^)(NSData *matchData))block {
__weak GameViewController *weakSelf = self;
[self.gkMatch loadMatchDataWithCompletionHandler:^(NSData *matchData, NSError *error) {
//Handle data
if (block)
block(matchData);
}];
}
//In another function
[self getMatchData:^(NSData *matchData) {
dispatch_async(dispatch_get_main_queue(), ^{
//Do stuff with data
});
}];