Сбой в действииForLayer: forKey: - PullRequest
12 голосов
/ 17 июня 2011

У меня загадочный 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) po self

; }; layer = >

(gdb) po event

оценка

(gdb) po layer

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

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

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

Edit: Вот полный след возврата к краху:

Тема 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 в __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 ]

10 голосов
/ 08 сентября 2011

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

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

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

1 голос
/ 24 мая 2018

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

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

UIKit Framework Reference

...