У меня есть контроллер представления панели управления, введенный в UINavigationController, а диспетчер представлений панели управления выступает в качестве делегата UICollectionView.UICollectionView Делегат освобожден при выполнении перезагрузки
На этом контролере панели управления есть кнопка «Назад», поэтому, когда пользователь нажимает кнопку «Назад», пользователь может вернуться к контроллеру корневого представления.
Однако у меня есть код, который будет выполнять пакетное обновление для UICollectionView, но когда пользователь быстро закроет кнопку до того, как блок будет выполнен, диспетчер представлений панели управления будет удален, поэтому я получил сбой.
Этот лот сообщает, что он разбит на if (weakSelf.ChartCollection.delegate)
, поскольку освобожден. Как избежать, если диспетчер просмотра освобожден, а другой блок пытается получить к нему доступ?
PS: отключение кнопки возврата НЕ является опцией.
Log:
*** -[DashboardViewController retain]: message sent to deallocated instance 0x14ef57360
* thread #1: tid = 0x1bb9b, 0x0000000184a72440 CoreFoundation`___forwarding___ + 968, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x184a72440)
frame #0: 0x0000000184a72440 CoreFoundation`___forwarding___ + 968
frame #1: 0x0000000184976b6c CoreFoundation`_CF_forwarding_prep_0 + 92
* frame #2: 0x000000010015b248 line 168: if (weakSelf.ChartCollection.delegate && weakSelf.DashboardModel.chartArray.count > 0) {
код: В reloadDashBoardData моей UICollectionView, в weakSelf обычай Посмотреть контейнер, он имеет объект UICollectionView:
dispatch_async(dispatch_get_main_queue(), ^{
if (weakSelf.ChartCollection) {
if (weakSelf.ChartCollection.delegate && weakSelf.DashboardModel.chartArray.count > 0) {
[weakSelf.ChartCollection performBatchUpdates:^{
[UIView performWithoutAnimation:^{
CLS_LOG(@"chart collection delegate:%@",weakSelf.ChartCollection.delegate);
[weakself.ChartCollection reloadItemsAtIndexPaths:@[path]];
}];
} completion:nil];
}
}
Вы можете войти '' weakSelf' до того, если (weakSelf.ChartCollection.delegate'? –
Я вошел weakSelf, weakSelf.ChartCollection, они действительный объект. Как сообщает LLDB weakSelf.ChartCollection.delegate освобождается. Если вы пытаетесь ро weakSelf .ChartCollection.delegate – Wingzero
Это странно, потому что если viewController освобожден, то weakSelf должен быть равен нулю, поскольку он является «слабым». Однако делегат UICollectionView является назначенным и не слабым, что означает, что он не будет равен нулю, поскольку viewController освобождается ... вы можно попробовать установить делегат с nil в dealloc –