- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从升级到 XCode 6.3 和 iOS 8.3 后,在将 NSManagedObjectContexts (MOC) 从后台合并到主线程 MOC 时,我的应用程序出现了一个新错误。
我的架构在主线程上有一个主 MOC,并在其他线程上创建了几个临时的后台 MOC,仅用于同步新的服务器数据。当这些后台 MOC 保存时,我会在主线程上监听通知 NSManagedObjectContextDidSaveNotification 并在主 MOC 上调用 mergeChangesFromContextDidSaveNotification。
这是根据有关使用 Core Data 进行线程处理的文档(请参阅 Core Data Concurrency)。
这曾经工作得很好,但是从这个更新开始崩溃并出现这个错误,我无法追溯到我的代码的特定行:
illegally invoked -perform* on dying NSManagedObjectContext at:
(
0 CoreData 0x28a2f273 <redacted> + 118
1 CoreData 0x28a32f09 <redacted> + 192
2 CoreFoundation 0x28c64e09 <redacted> + 12
3 CoreFoundation 0x28bbf515 _CFXNotificationPost + 1784
4 Foundation 0x29920749 <redacted> + 72
5 Foundation 0x2992522f <redacted> + 30
6 Foundation 0x29986a93 <redacted> + 98
7 Foundation 0x299867f7 <redacted> + 82
8 Foundation 0x299dfbd5 <redacted> + 408
9 CoreFoundation 0x28c72fed <redacted> + 20
10 CoreFoundation 0x28c706ab <redacted> + 278
11 CoreFoundation 0x28c709ff <redacted> + 734
12 CoreFoundation 0x28bbd201 CFRunLoopRunSpecific + 476
13 CoreFoundation 0x28bbd013 CFRunLoopRunInMode + 106
14 GraphicsServices 0x30359201 GSEventRunModal + 136
15 UIKit 0x2c361a59 UIApplicationMain + 1440
16 MyAppName 0x000c95a7 main + 170
17 libdyld.dylib 0x376c1aaf <redacted> + 2
)
我已经在 XCode 中打开僵尸,寻找释放的上下文,但没有找到。调用合并的主线程监听器如下所示:
- (void)coreDataDidSaveNotification:(NSNotification *)notification {
NSManagedObjectContext *savedContext = (NSManagedObjectContext *)notification.object;
if (savedContext != self.mainManagedObjectContext) {
__weak typeof(self) weakSelf = self;
[self.dispatch dispatchOnMainThread:^{
NSLog(@"before merge");
[weakSelf.mainManagedObjectContext mergeChangesFromContextDidSaveNotification:notification];
NSLog(@"after merge");
}];
}
}
“合并后”的日志消息在崩溃发生之前被调用,这非常令人困惑。我已经在通知的背景上下文中检查了 retainCount,当合并被调用时它总是大于零,所以它不会在那个时候被释放。
知道发生了什么吗?
最佳答案
经过大量研究,我发现后台上下文确实在合并完成之前就已经释放了。 如果我保留对它们的引用,则不会发生崩溃。
看起来 mergeChangesFromContextDidSaveNotification 方法的行为发生了变化。持有上下文的通知过去足以保留它直到合并完成。
我相信现在发生的事情是 mergeChangesFromContextDidSaveNotification 方法现在在内部持有一个弱引用,并在内部分派(dispatch)主线程上的合并再次,将其排队等待下一个运行循环,这就是为什么我在崩溃发生之前看到“合并后”日志的原因。当合并在下一个运行循环中实际执行时,我已经释放了我对后台 MOC 的引用,并且当它超出范围时通知已经释放,并且由于内部引用现在可能弱 后台 MOC 被释放。
关于ios - Core Data 崩溃时出现错误 "dying managedobjectcontext",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29681794/
这是在 MacOS 上通过自制软件安装了 PHP 8.1.10 ... 只是一个空白的 index.php 代码,只有这段代码...... 然后 .. 在我的浏览器中呈现以查看... Fatal
我相信所有这些(甚至是 die() 或 die(0))都是相同的。如果它们不相同,那么哪个更适合成功退出脚本?如果它们相同,是否有任何首选标准表明脚本成功完成?我倾向于使用 exit;. 编辑:所有答
在对项目中一个非常模糊的错误进行了一些认真的调试之后,我能够得到这个简短的代码。一个没有死亡的死亡调用。 该问题仅在调用 script.pl 时发生。如果直接调用Class_A,那么die调用就会成功
注意:我正在使用输出缓冲。它只是包含在 head() 和 foot() 函数中。 我使用以下模板在我当前的 PHP 项目中创建页面: 以下示例是否适合使用 die()?另外,如果有的话,这可能给
我想这样写: die "Error in file $0 line number $line_number_of_this_cmd_in_file \n"; 在我的 perl 脚本文件中。 有什么帮助
下面是我尝试执行的代码 $a=0; if($a==0){die print"zero"}; 我得到如下输出 1 at test.pl line 2 Zero 我想知道首先打印的 1 是什么,
我使用以下代码在 perl 中运行一个简单的文件测试: my $f1 = "$pre_file"; unless (-e $1) { print "\n Pre_check file does n
我目前正在制作一个注册页面。它包括密码散列和验证。当我使用“die”时,它会停止表单并显示错误。我想在同一页面上显示错误。 $_POST['username'] ); try
我总是在发出 die() 命令之前调用 mysqli_close()。 这很乏味,有时会被遗忘,但我想确定 die 命令是关闭所有 mysql 连接还是仍然保持打开状态? 我无法通过 PHP 检查,因
让 die() 存在于生产环境中是否被认为是不好的做法?刚好看到这篇文章http://www.phpfreaks.com/blog/or-die-must-die作者抨击在生产环境中使用这种东西的人。
当我刚开始学习 PHP 时,我会编写类似于这里的查询语句: mysql_query("SELECT * FROM `table`") or die(mysql_error()); 目前最好的方法是什么
有没有人在 Python 中使用类似的东西: def die(error_message): raise Exception(error_message) ... check_somethin
我正在使用以下行进行一个简单的系统调用,该调用有效: system ("mkdir -p Purged") or die "Failed to mkdir." ; 执行脚本确实会进行系统调用,我可以找
我有一个通过 die 引发异常的脚本.当我捕捉到异常时,我想输出没有附加位置信息的消息。 这个脚本: #! /usr/bin/perl -w use strict; eval { die "M
在Perl中,如果程序因错误退出,则可以编写$SIG{__DIE__}处理程序来执行代码。 bash是否提供类似的功能? 这是我要尝试的操作:我有一个bash脚本,该脚本创建一个新目录并调用几个命令,
自从我创建 HTA 代码以来,我一直使用 IE :( 我们需要将更改事件捕获在 中元素,但你猜怎么着,IE 不支持该事件。 所以我创造了一种模仿它的方法。与 单击时显示 略低于。那部分工作正常。问题
this => set_time_limit (), Die() 可以用来取消文件上传吗。 即当用户单击按钮时,set_time_limit () 函数将执行。 它会停止上传吗? 最佳答案 您最好使用
我正在开发一些项目。我想控制不同的错误。我知道在所有流行的框架和 php 项目中都有不同的异常。但我认为这不是必需的工作。如果发生错误,我们可以用我们的消息制作 die()。1. Exceptions
最近我参加了 Jeffrey Richter 的有关 .NET 的培训类(class)。他提到了一种编码策略“死亡很棒”。也就是说,即使在程序或事件循环的根部也不要编写“catch (Exceptio
假设我们的类中有以下代码: //class code TextBox t = new TextBox(); ListBox l = new ListBox(); 我们有两种可能的情况: 首先,我们将
我是一名优秀的程序员,十分优秀!