2015-11-24 1 views
2

У меня случился сбой, который, согласно отчету о сбоях, не является моей ошибкой. Я хотел бы, чтобы это было правдой. Я профилировал приложение с 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 

Мое приложение не перечисленные здесь в любом месте рухнувшего нити. У меня есть несколько вопросов:

  1. Как интерпретировать этот отчет, чтобы найти триггер аварии? Я вижу ссылки UILabels, на которые есть ссылки, и у меня их много, как бы я узнал, что может быть причиной?
  2. Является ли авария одной из строк в середине, и отчет показывает действия до и после, чтобы обеспечить контекст?

Благодарим за помощь. Эта отладка путается.

обновление: 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 д. Я вносил изменения в предлагаемый ответ, но я все еще получаю такой же крах.

Спасибо.

ответ

4

Вы рушитесь, потому что вы нарушили правило о том, что потомки UIView можно манипулировать только по основной теме. Сбой не обязательно является единственным результатом, но, по мнению Apple, это вполне приемлемо.

Исправьте свой код, чтобы он отправил этот кусочек работы в основную нить.

+0

Спасибо за быстрый ответ @Avi. Я посмотрю на это. – SteveSTL

+0

У меня вопрос техники. Вся моя сборка и манипуляция с большими нагрузками выполняется с основного потока. Когда вы принудительно используете основной поток с помощью отправки, обычно вы обертываете целые большие части кода внутри блока dispatch_get_main_thread или только те элементы, которые действительно должны выполняться в основном потоке? Благодарю. – SteveSTL

+1

Общее правило - делать как можно больше на потоках фона и отправлять только основной поток кода, который должен быть там. Основной поток - это где события пользовательского интерфейса (затрагиваются, в основном) обрабатываются, поэтому чем больше работы выполняется в основном потоке, тем менее отзывчивым может быть приложение для пользователей. – Avi