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