Как определить, происходит ли сбой UIScrollView в моем коде или коде Apple?

Я периодически повторяю сбой отладочной сборки, работающей на моем iPhone, с участием UIScrollView, при этом мой код не находится в кадре стека. Я хотел бы знать, является ли это ошибкой в ​​моем коде или коде Apple, и я не могу запросить базу данных ошибок Apple, чтобы узнать, было ли о ней сообщено. Обратная трассировка показывает:

#0  0x30218060 in ___forwarding___ ()
#1  0x3020eda0 in __forwarding_prep_0___ ()
#2  0x309c4ce8 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] ()
#3  0x3025af60 in -[NSObject performSelector:withObject:] ()
#4  0x3098ea94 in -[UIAnimator stopAnimation:] ()
#5  0x3098e5a8 in -[UIAnimator(Static) _advance:] ()
#6  0x3098e460 in LCDHeartbeatCallback ()
#7  0x32047fe8 in HeartbeatVBLCallback ()
#8  0x32a1c3ec in IOMobileFramebufferNotifyFunc ()
#9  0x3188a74c in IODispatchCalloutFromCFMessage ()
#10 0x3020d0b0 in __CFMachPortPerform ()
#11 0x30254a76 in CFRunLoopRunSpecific ()
#12 0x3025416a in CFRunLoopRunInMode ()
#13 0x320452a4 in GSEventRunModal ()
#14 0x308f037c in -[UIApplication _run] ()
#15 0x308eea94 in UIApplicationMain ()
#16 0x0000280c in main (argc=1, argv=0x2ffff58c) at /Users/esilver/Documents/Husband Material/main.m:14

Проблема видимо в UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded. ГБД сообщает:

-[MyViewController respondsToSelector:]: message sent to deallocated instance 0x5d77ad0

В MyViewController у меня есть вызов для прокрутки tableView:

[self.tableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];  

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

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

К вашему сведению, эта ошибка также воспроизводится только в условиях нехватки памяти, т. Е. Я начал получать обратные вызовы didReceiveMemoryWarning.

Спасибо всем,

Эрик


person esilver    schedule 24.02.2010    source источник


Ответы (1)


Сначала делегаты должны быть типа weak/assign. Но даже в этом случае есть очень распространенное тонкое препятствие, вызванное анимацией прокрутки. Если вы используете изменения смещения анимированного содержимого для ваших ScrollViews, вам настоятельно необходимо установить для его делегата значение nil в методе dealloc. .

В противном случае вы получите следующее

[YourViewController respondsToSelector:]: message sent to deallocated instance

Очень распространенный пример:

1. _tableView is ivar of YourViewController
2. _tableView.delegate = self;
3. - (void)scrollViewDidScroll:(UIScrollView *)scrollView is implemented at YourViewController
4. at some point you call [_tableView scrollToRowAtIndexPath:indexPath 
   atScrollPosition:UITableViewScrollPositionBottom animated:YES];
   or [_tableView setContentOffset:CGPoint animated:YES]
   and try to close YourViewController

_tableView сохраняется CoreAnimation, но YourViewController освобождается!

person malex    schedule 14.12.2013