Я получаю странный сбой от некоторых из моих бета-тестеров, с которыми у меня возникли проблемы. Символические отчеты о сбоях указывают на то, что сбой происходит при простом выделении контроллера как одноэлементного при вызове инициализации, но, согласно трассировке стека, кажется, что код, который у меня есть в 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
Вот стек вызовов сбоя после того, как я нашел способ воспроизвести его< img src="https://i.stack.imgur.com/eboru.png" alt="alt text">
и соответствующий код:
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, что означает, что переменная индекса, вероятно, была установлена на -1, если это поможет. Я потерялся здесь.
[РЕШЕНО] ОБНОВЛЕНИЕ 3
Я был прав насчет версий :) Я перечитал раздел о версиях в < href="https://rads.stackoverflow.com/amzn/click/com/1934356328" rel="nofollow noreferrer" rel="nofollow noreferrer">книгу Зарры и имел большой DOH< /сильный> момент. Это первый раз, когда у меня было приложение с 3 версиями базы данных. Я использую модели сопоставления в своем приложении и наивно предполагал, что основные данные смогут отображать 1-2 с использованием одной модели, а затем 2-3 с использованием следующей. Я буквально ударился головой, когда понял, что у меня нет модели отображения 1-3. чтобы проверить это, я быстро добавил один, и все так же гладко, как по маслу. Теперь мне просто нужно вернуться и использовать его
Progressive Data Migration
семплов, чтобы облегчить себе жизнь, поскольку я продолжаю работать с новой версией этой БД.
Я надеюсь, что Зарра приедет сюда и ответит что-нибудь… что угодно… так что я могу поставить ему баллы за это :)