Сбой в действии 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

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

(gdb) po self

; }; слой = >

(gdb) событие po

ограничивает

(gdb) уровень po

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

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

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

Редактировать: вот полная трассировка сбоя:

Поток 1, очередь:
com.apple.main-thread
# 0 0x00459b2c in - [UIView (CALayerDelegate) actionForLayer: forKey:] ()
# 1 0x00eaaac7 in - [CALayer actionForKey:] ()
# 2 0x00ea80fe в действииForKey (CALayer *, CA :: Транзакция *, 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 в - [UILabel setFrame:] ()
# 9 0x0000a97f в - [MosaicElementView setupWithAdvert:] в /Users/eino/Prog/AJ/Classes/Search/SubViews/MosaicElementView.m:30
# 10 0x00079cb9 in - [SearchResultsViewController setupElement: withCell: indexPath: actualIndex:] ()
# 11 0x000797a2 в - [SearchResultsViewController tableView: cellForRowAtIndexPath:] ()
# 12 0x004957fa в - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow: withIndexPath:] ()
# 13 0x0048b77f in - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow:] ()
# 14 0x004a0450 в - [UITableView (_UITableViewPrivate) _updateVisibleCellsNow:] ()
# 15 0x00498538 в - [UITableView layoutSubviews] ()
# 16 0x00eb0451 в - [CALayer layoutSublayers] ()
# 17 0x00eb017c в CALayerLayoutIfNeeded ()
# 18 0x00ea937c в CA :: Context :: 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).

12
задан Eino Gourdin 8 September 2011 в 09:17
поделиться