У меня есть UIViewController
с UICollectionView
, реализующим свои delegate
и dataSource
. В 95% случаев все работает нормально, но иногда возникает сбой (лог, код и т.д. ниже). Я думаю, что это происходит, когда successBlock
из myOperation
выполняется в тот же момент, когда контроллер освобождается (но я не уверен).
Учитывая другой вопрос от SOF, я предположим, что myCollectionView == nil
, однако delegate
все еще куда-то указывает (не следует ли его изменить, насколько я вижу, это просто присвоение свойства). Я понятия не имею, как решить такую проблему, кто-нибудь знает?
Журнал сбоев:
MyCollectionViewController.m line 0
__destroy_helper_block_
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000a
Стек вызовов:
libobjc.A.dylib
objc_msgSend + 5
retain
UIKit
-[UICollectionViewController collectionView] + 54
MyAppName
MyCollectionViewController.m line 30
-[MyCollectionViewController dealloc]
MyAppName
MyCollectionViewController.m line 0
__destroy_helper_block_
libsystem_blocks.dylib
_Block_release + 216
MyAppName
MyDownloaderController.m line 0
__destroy_helper_block_75
libsystem_blocks.dylib
_Block_release + 216
MyAppName
MyOperation.m line 0
__destroy_helper_block_19
libsystem_blocks.dylib
_Block_release + 216
MyAppName
MyOperation.m line 0
__destroy_helper_block_112
libsystem_blocks.dylib
_Block_release + 216
UIKit
UIApplicationMain + 1136
MyAppName
main.m line 15
main
Где строки около 30 в MyCollectionViewController:
- (void)dealloc {
if ([self isViewLoaded] && self.collectionView) { // line 30
self.collectionView.delegate = nil;
self.collectionView.dataSource = nil;
self.collectionView = nil;
}
}
Мой успехБлок:
MySuccessHandler successBlock = ^(UIImage *image) {
if (weakCell) {
[weakCell.pageImageView setImage:image];
}
};