2015-02-25 3 views
0

У меня есть контроллер представления панели управления, введенный в 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]; 
       } 
      } 
+0

Вы можете войти '' weakSelf' до того, если (weakSelf.ChartCollection.delegate'? –

+0

Я вошел weakSelf, weakSelf.ChartCollection, они действительный объект. Как сообщает LLDB weakSelf.ChartCollection.delegate освобождается. Если вы пытаетесь ро weakSelf .ChartCollection.delegate – Wingzero

+0

Это странно, потому что если viewController освобожден, то weakSelf должен быть равен нулю, поскольку он является «слабым». Однако делегат UICollectionView является назначенным и не слабым, что означает, что он не будет равен нулю, поскольку viewController освобождается ... вы можно попробовать установить делегат с nil в dealloc –

ответ

0

На ваш взгляд контроллера dealloc, ноль вашего CollectionView делегаты. Я считаю, что проблема заключается в свойстве assign CollectionView.

+0

, но внутри блока, не должно быть сильного «я», не так ли? – Wingzero

+0

Вы принимаете ссылку на слабость не на себя. –

+0

Прошу прощения, если я ввел вас в заблуждение, reloadData находится в моем файле UIColelctionView .m, и проблема в том, что делегат получил освобождение. weakSelf - это настраиваемый контейнер представления, а не тот же объект, что и делегат. – Wingzero

Смежные вопросы