我正在尝试追踪似乎肯定是时间问题的错误。我有一个使用通用框架的应用程序。当流程在框架中完成时,NSNotification将发送回应用程序。我们最近在我们的框架中添加了第三方框架。现在,在执行第三方框架的方法时,当执行返回到我们的框架时,我在控制台输出中收到以下错误:
Assertion failed: (exclusive), function assert_locked, file ../dep/include/boost/boost_1_55_0/boost/thread/pthread/shared_mutex.hpp, line 51.
但我不确定这是否是最终问题,因为我们的框架继续执行并且NSNotification被发送回应用程序。在发送通知并且执行返回到我们框架中的调用方法(或方法调用)之后,我在执行线程上看到警告。然后,执行继续回到原始调用方法,警告消失。
这是奇怪的部分。如果我非常缓慢地逐步执行代码,它可能会起作用。如果我不够慢,我会得到SIGSTOP,代码永远不会返回到UI。如果我太快,我会得到一个SIGABRT。
我一直试图使用Instuments找到确切的问题。 This answer to a similar question支持我的怀疑,这是一个时间问题。我认为提升assert_locked Assertion可能与此有关。
我的代码很无聊,但我知道你想看到它,所以这里是:
- (void)generateImageTemplates:(UIImage *)src
{
int result = 0;
cv::Mat image = *(cv::Mat*)[self cvMatFromUIImage:src];
user = IEngine_InitUser();
int userID=0;
result = IEngine_AddFingerprintRAW(user, UNKNOWN, image.data, image.size().width, image.size().height);
result = IEngine_RegisterUser(user, &userID);
[[NSNotificationCenter defaultCenter] postNotificationName:@"InnovatricsComplete" object:self];
}
如果您想知道结果是什么,那就是错误代码。到目前为止,这些都回到了等于0.意思是没有错误。一旦我成功返回到UI而不崩溃,我将处理这些错误。
控制返回方法调用:
- (void)generateImageTemplates:(UIImage *)processedImage
{
[self.captureCommand generateImageTemplates:processedImage];
}
Control返回应用程序View Controller中的方法调用:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0){
[self clearPressed:self.clearButton];
} else {
[self.cameraVC generateImageTemplates:self.processedImage];
}
}
最后,NSNotification回调代码:
- (void)onInnovatricsComplete:(NSNotification *)note
{
[self.cameraVC willMoveToParentViewController:nil];
[self.cameraVC.view removeFromSuperview];
[self.cameraVC removeFromParentViewController];
}
我警告过你这很无聊!
我完全难过!虽然我继续在网上冲浪寻找线索,但有没有人可以帮我解决这个问题?
谢谢。
以下是一些截图(反向顺序):
答案 0 :(得分:2)
在How to know where crash for postNotificationName:object:userInfo
中查看NSUinteger的答案侦听器在收到通知之前可能会被释放。