Сбой в действии ForLayer:forKey:

У меня загадочный EXC_BAD_ACCESS при изменении кадра UILabel. Авария случайная, обычно мне приходится повторять условия в течение нескольких минут.

Включение NSZombies, а также других флагов отладки памяти (NSDebugEnabled, MallocStackLogging) не помогает, сбой по-прежнему остается непрозрачным: просто BAD_ACCESS без сообщения в консоли. Цель кажется правильной и живой, поэтому она не выглядит как проблема с выделенной памятью.

Чтобы получить больше информации, я вложил в UILabel подкласс и переписал функцию сбоя:

@implementation TestUILabel
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event {
    return [super actionForLayer:layer forKey:event];
}
@end

Сбой в методе супер, но при проверке все кажется правильным (печать retainCount для 'self' и 'layer' дает соответственно 3 и 2):

(GDB) по себе

; }; layer = >

(GDB) Po событие

оценки

(GDB) ПО слой

; }; layer = >; содержимое = ; непрозрачность = 1; animations = [position= ]>

Кто-то получил подобную проблему? Или есть идеи, откуда это может прийти?

Заранее спасибо!

Редактировать: вот полный след возврата аварии:

Поток 1, Очередь:
com.apple.main-нить
# 0 0x00459b2c in - [UIView (CALayerDelegate) actionForLayer: forKey:] ()
# 1 0x00eaaac7 in - [CALayer actionForKey:] ()
# 2 0x00ea80fe в actionForKey (CALayer *, CA:: Transaction *, NSString *) ()
# 3 0x00ea8066 в beginChange (CALayer *, CA:: Transaction *, unsigned int, objc_object * &) ()
# 4 0x00eaba3a в CALayerSetPosition (CALayer *, CA:: Vec2 const &, bool) ()
# 5 0x00eab8b5 in - [CALayer setPosition:] ()
# 6 0x00eab7cc in - [CALayer setFrame:] ()
# 7 0x0045739d in - [UIView (Geometry) setFrame:] ()
# 8 0x00542a68 in - [UILabel setFrame:] ()
# 9 0x0000a97f in - [MosaicElementView setupWithAdvert:] в /Users/eino/Prog/AJ/Classes/Search/SubViews/MosaicElementView.m:30
# 10 0x00079cb9 in - [SearchResultsViewController setupElement: withCell: indexPath: actualIndex:] ()
# 11 0x000797a2 in - [SearchResultsViewController tableView: cellForRowAtIndexPath:] ()
# 12 0x004957fa in - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow: withIndexPath:] ()
# 13 0x0048b77f in - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow:] ()
# 14 0x004a0450 in - [UITableView (_UITableViewPrivate) _updateVisibleCellsNow:] ()
# 15 0x00498538 in - [UITableView layoutSubviews] ()
# 16 0x00eb0451 in - [CALayer layoutSublayers] ()
# 17 0x00eb017c в CALayerLayoutIfNeeded ()
# 18 0x00ea937c в CA:: Context:: commit_transaction (CA:: Transaction *) ()
# 19 0x00ea90d0 в CA::Transaction:: commit () ()
# 20 0x00ed97d5 в CA::Transaction:: наблюдатель_callback(__CFRunLoopObserver*, длинный без знака, пустой *) ()
# 21 0x017e9fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
# 22 0x0177f0e7 в __CFRunLoopDoObservers ()
# 23 0x01747bd7 в __CFRunLoopRun ()
# 24 0x01747240 в CFRunLoopRunSpecific ()
# 25 0x01747161 в CFRunLoopRunInMode ()
# 26 0x01e7d268 в GSEventRunModal ()
# 27 0x01e7d32d в GSEventRun ()
# 28 0x0043042e в UIApplicationMain ()
# 29 0x000021fe на главном в /Users/eino/Prog/AJ/main.m:11

Строка срыва от кадра 9 - это просто смена кадра:

labelPrice.frame = rect;

с правильным прямоугольником CGRect (106, 143, 86, 22).

2 ответа

Решение

Вы, наверное, уже проверили на это, но это стоит выстрел...

Вы уверены, что не делаете ничего, что могло бы повлиять на какие-либо элементы пользовательского интерфейса в фоновом потоке? Возможно, вы выполняете некоторые вычисления, связанные с этим поиском, и это меняет свойство некоторого представления.

Я видел подобные вещи в тех случаях, когда я забывал вызов executeSelectorOnMainThread:withObject:waitUntilDone: и затем изменял пользовательский интерфейс в фоновом режиме.

Этот сбой имеет неосновные потоки, которые используют классы или функции UIKit. Вообще говоря, UIKit безопасно использовать только из основного потока. Вызов UIKit из фоновых потоков может привести к непредсказуемому поведению (например, сбоям!). Пожалуйста, проверьте, чтобы весь ваш код (который не входит в основной поток) был явно помечен Apple как безопасный для использования в фоновом режиме.

Внешние ресурсы:

UIKit Framework Ссылка

Другие вопросы по тегам