我的一些测试版测试人员遇到了一个奇怪的崩溃,我遇到了麻烦。符号化的崩溃报告表明在init调用时,控制器作为单例进行简单分配时发生崩溃,但根据堆栈跟踪,我 init
中的代码似乎不在崩溃是。以下是相关代码:
1534| + (UA[REDACTED]PlayerController*)sharedInstance
1535| {
1536| @synchronized(self)
1537| {
1538| if (sharedInstance == nil)
1539| sharedInstance = [[UA[REDACTED]PlayerController alloc] init];
1540| }
1541| return sharedInstance;
1542| }
之前从未崩溃,代码最近没有改变。这是升高的堆栈跟踪:
Thread 5:
0 libSystem.B.dylib 0x33bd52d4 __kill + 8
1 libSystem.B.dylib 0x33bd52c4 kill + 4
2 libSystem.B.dylib 0x33bd52b6 raise + 10
3 libSystem.B.dylib 0x33be9d26 __abort + 62
4 libSystem.B.dylib 0x33be9d7e abort + 62
5 libSystem.B.dylib 0x33bd7980 __assert_rtn + 152
6 libgcc_s.1.dylib 0x32acab4e _Unwind_SjLj_Resume + 26
7 [REDACTED] 0x00060b64 +[UA[REDACTED]PlayerController sharedInstance] (UA[REDACTED]PlayerController.m:1540)
8 [REDACTED] 0x00063e6c -[UA[REDACTED]PlayerViewController setupControlViews] (UA[REDACTED]PlayerViewController.m:224)
9 [REDACTED] 0x00062ce0 -[UA[REDACTED]PlayerViewController viewDidLoad] (UA[REDACTED]PlayerViewController.m:268)
10 UIKit 0x320a0270 -[UIViewController view] + 104
…
关于这个神秘崩溃是什么以及它可能来自哪里的任何想法?
PlayerController
根本没有关系。任何核心数据专家都有一些见解?
击>
if (resultArray && [resultArray count]) {
for (MixAudio *ma in resultArray) {
Audio *audio = [ma valueForKey:LOCAL_MIX_AUDIO_AUDIO_KEY];
if (audio) {
[returnArray addObject:audio];
}
}
为了帮助解释我做了什么来重现它,我必须解释一下数据结构。我有Mix
和Audio
个项目。混音有很多音频,音频属于很多混音。这是对MixAudio对象的简单关系调用以获取音频。现在,这只是在之后崩溃我将数据库恢复到新版本。
我的设置中的数据库备份意味着压缩数据库以保存数据,然后在恢复时解压缩。此崩溃仅在还原过程后发生。为了使事情变得更复杂,有3个带有映射模型的数据库版本。因为这个过程在版本控制之前对我有用,所以我觉得我的版本中的某些东西导致了这次崩溃。
所有其他数据都很好,可以访问,甚至保存。不知何故,这个单一的提取导致了问题。设置持久性存储或托管对象模型时没有错误或警告。此外,可以创建和访问新的Mix对象,只有较旧的提取(在还原之前位于数据库中)才会失败。
如果我没有发现错误,控制台会打印:
Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.
在崩溃线周围放置一个try/catch
,可以检查根崩溃原因:
Error: NSRangeException: *** -[NSMutableArray objectAtIndex:]: index 4294967295 beyond bounds [0 .. 16]
但这对于简单的valueForKey
调用没有意义(至少对我来说)。 4294967295 = 2 ^ 32-1这意味着如果有帮助,索引var可能设置为-1。我迷失在这里。
Progressive Data Migration
样本,让我的生活变得更轻松,因为我继续使用更多版本的数据库。
我希望Zarra在这里开车并回答一些事情......任何事情......所以我可以给他点数:)
答案 0 :(得分:2)
虽然OP能够解决他自己的问题,但清楚地了解迁移是有帮助的。
创建数据模型的第二个版本时,需要从版本1到版本2的映射模型。
当您创建第三个模型时,您需要一个到两个的映射模型 AND 一个地图从一到三。
添加第四个模型时,您需要以下模型:
从那里开始取得更多进展。