Подтвердить что ты не робот

Сбой в actionForLayer: 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

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

(gdb) po self

< TestUILabel: 0x6ac2800; baseclass= UILabel; frame = (173 174; 0 0); текст = '54 м² '; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = НЕТ; анимация = { положение = < CABasicAnimation: 0xe07ba60 > ; }; layer = < CALayer: 0xbf1b950 →

(gdb) po event

Границы

(gdb) po layer

< CALayer: 0xbf1b950; position = CGPoint (173 174); bounds = CGRect (0 0; 0 0); делегат = < TestUILabel: 0x6ac2800; baseclass= UILabel; frame = (173 174; 0 0); текст = '54 м² '; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = НЕТ; анимация = { положение = < CABasicAnimation: 0xe07ba60 > ; }; layer = < CALayer: 0xbf1b950 → ; contents = < CGImage 0xe04ed60 > ; непрозрачность = 1; анимация = [Положение = < CABasicAnimation: 0xe07ba60 > ] >

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

Спасибо заранее!

Изменить: здесь полная авария:

Тема 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 - [МозаикаElementView 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 в - [UITableView layoutSubviews]()
# 16 0x00eb0451 in - [CALayer layoutSublayers]()
# 17 0x00eb017c в CALayerLayoutIfNeeded()
# 18 0x00ea937c в CA:: Контекст:: commit_transaction (CA:: Transaction *) ()
# 19 0x00ea90d0 в CA:: Transaction:: commit()()
# 20 0x00ed97d5 в CA:: Transaction:: observer_callback (__ CFRunLoopObserver *, unsigned long, void *)()
# 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;

где rect является правильным CGRect (106, 143, 86, 22).

4b9b3361

Ответ 1

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

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

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