У меня случился сбой, который, согласно отчету о сбоях, не является моей ошибкой. Я хотел бы, чтобы это было правдой. Я профилировал приложение с NSZombies, и этого там не было. Вот выдержки из отчета об аварии:Мое приложение не включено в разбитую нить
Date/Time: 2015-11-23 19:40:34.34 -0600
Launch Time: 2015-11-23 18:49:43.43 -0600
OS Version: iOS 9.1 (13B143)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000c
Triggered by Thread: 7
Thread 7 Crashed:
0 libobjc.A.dylib 0x34fcbac6 objc_msgSend + 6
1 UIFoundation 0x31e7242e +[NSStringDrawingTextStorageSettings threadSpecificStringDrawingTextStorageSettings:] + 62
2 UIFoundation 0x31e675de +[NSString(NSStringDrawing) typesetterBehavior] + 34
3 UIFoundation 0x31e68ae2 __NSStringDrawingEngine + 298
4 UIFoundation 0x31e68908 -[NSString(NSExtendedStringDrawing) drawWithRect:options:attributes:context:] + 144
5 UIKit 0x276aa488 -[UILabel _drawTextInRect:baselineCalculationOnly:] + 4864
6 UIKit 0x2771b40c -[UILabel drawTextInRect:] + 540
7 UIKit 0x2771b1e4 -[UILabel drawRect:] + 88
8 UIKit 0x2771b15e -[UIView(CALayerDelegate) drawLayer:inContext:] + 386
9 QuartzCore 0x26f8b6fc -[CALayer drawInContext:] + 228
10 QuartzCore 0x26f75088 CABackingStoreUpdate_ + 1852
11 QuartzCore 0x270619d0 ___ZN2CA5Layer8display_Ev_block_invoke + 52
12 QuartzCore 0x26f745c8 CA::Layer::display_() + 1168
13 QuartzCore 0x26f588a0 CA::Layer::display_if_needed(CA::Transaction*) + 204
14 QuartzCore 0x26f58560 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24
15 QuartzCore 0x26f57a78 CA::Context::commit_transaction(CA::Transaction*) + 368
16 QuartzCore 0x26f5772a CA::Transaction::commit() + 614
17 QuartzCore 0x26f84ed2 CA::Transaction::release_thread(void*) + 310
18 libsystem_pthread.dylib 0x3589e54c _pthread_tsd_cleanup + 508
19 libsystem_pthread.dylib 0x3589e14e _pthread_exit + 86
20 libsystem_pthread.dylib 0x3589db3c _pthread_wqthread + 1044
21 libsystem_pthread.dylib 0x3589d718 start_wqthread + 8
Мое приложение не перечисленные здесь в любом месте рухнувшего нити. У меня есть несколько вопросов:
- Как интерпретировать этот отчет, чтобы найти триггер аварии? Я вижу ссылки UILabels, на которые есть ссылки, и у меня их много, как бы я узнал, что может быть причиной?
- Является ли авария одной из строк в середине, и отчет показывает действия до и после, чтобы обеспечить контекст?
Благодарим за помощь. Эта отладка путается.
обновление: 11/27/15:
мне нужно сделать ли уверен, что заявление, как следующее делается в основном потоке:
UIView *lineView;
или только изменения, как следующее :
lineView = [[UIView alloc] initWithFrame:CGRectMake(15, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)];
у меня возникли проблемы определения того, что должно быть завернуты в GCD отправок и что может быть сделано на фоне threa д. Я вносил изменения в предлагаемый ответ, но я все еще получаю такой же крах.
Спасибо.
Спасибо за быстрый ответ @Avi. Я посмотрю на это. – SteveSTL
У меня вопрос техники. Вся моя сборка и манипуляция с большими нагрузками выполняется с основного потока. Когда вы принудительно используете основной поток с помощью отправки, обычно вы обертываете целые большие части кода внутри блока dispatch_get_main_thread или только те элементы, которые действительно должны выполняться в основном потоке? Благодарю. – SteveSTL
Общее правило - делать как можно больше на потоках фона и отправлять только основной поток кода, который должен быть там. Основной поток - это где события пользовательского интерфейса (затрагиваются, в основном) обрабатываются, поэтому чем больше работы выполняется в основном потоке, тем менее отзывчивым может быть приложение для пользователей. – Avi