Я получаю странный сбой от некоторых из моих бета-тестеров, с которыми у меня проблемы. Символические отчеты о сбоях указывают на то, что сбой происходит при простом выделении контроллера как одиночного при вызове 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
…
Есть какие-нибудь идеи относительно того, что это за загадочная авария и откуда она может исходить?
ОБНОВЛЕНИЕ 1
Похоже, это связано с основными данными и миграциями. Мне удалось продублировать его, но первопричина до сих пор неизвестна. У меня есть некоторые автоматические миграции, которые есть в этой версии, и кажется, что, хотя некоторые из NSManagedObjects могут быть прочитаны, другие выдают это исключение, особенно в отношении NSManagedObjects. Это может вообще не относиться к
PlayerController
. У каких-нибудь экспертов Core-Data есть понимание?
ОБНОВЛЕНИЕ 2
Вот стек вызовов сбоя после того, как я нашел способ воспроизвести его
и соответствующий код:
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, если это поможет. Я здесь потерян.
[решено] ОБНОВЛЕНИЕ 3
Я был прав насчет того, что это было в версиях :) Я перечитал раздел о версиях в
книге Зарры и у меня был
DOH момент. Впервые у меня появилось приложение с 3 версиями базы данных. Я использую модели картографирования в своем приложении, и я наивно полагал, что базовые данные смогут отображаться из 1-2 при использовании одной модели, а затем через 2-3 при использовании следующей. Я буквально ударился головой, когда понял, что у меня нет модели картирования 1-3. чтобы проверить это, я добавил один быстро, и все так гладко, как масло. Теперь мне просто нужно вернуться и использовать его
Progressive Data Migration
семплов, чтобы облегчить мне жизнь, когда я продолжу работу над новой версией этой БД.
Я надеюсь, что Зарра приедет сюда и ответит что-нибудь ... что-нибудь ... так что я могу дать ему очки за это :)