Как определить, происходит ли сбой UIScrollView в моем коде или в коде Apple? - PullRequest
5 голосов
/ 24 февраля 2010

Я периодически повторяю сбой при отладочной сборке, запущенной на моем 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.

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

Эрик

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Я только что нашел эту тему в StackOverflow здесь :

Я думаю, что это отвечает на мой собственный вопрос. Nevermind ...

1 голос
/ 15 декабря 2013

Сначала делегаты должны иметь тип слабый / назначить . Но событие в этом случае происходит очень часто тонкое препятствие, вызванное анимацией прокрутки. Если вы используете анимированные изменения содержания для ваш ScrollViews вам настоятельно необходимо установить делегат на ноль при 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 освобождается!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...