很诡异的crash
发生在Xcode13 Version 11.1 (11A1027)
用法
- (void)setupLayoutAndCollectionView{
CHTCollectionViewWaterfallLayout* flowLayout = [[CHTCollectionViewWaterfallLayout alloc] init];
if (self.hasFollow == NO) {
flowLayout.columnCount = 1;
flowLayout.minimumInteritemSpacing = 0;
[self.view addSubview:self.attensionHeaderView];
[self.collectionView mas_updateConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsMake(self.attensionHeaderView.height, 0, 0, 0));
}];
}else {
flowLayout.columnCount = kFeedColumnCount;
flowLayout.sectionInset = kFeedSecitonInset;
flowLayout.minimumColumnSpacing = kFeedColumnSpacing;
flowLayout.minimumInteritemSpacing = kFeedInteritemSpacing;
[self.attensionHeaderView removeFromSuperview];
[self.collectionView mas_updateConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsZero);
}];
}
[self.collectionView setCollectionViewLayout:flowLayout];
self.collectionView.backgroundColor = [UIColor whiteColor];
[self.collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([HomeCollectionViewCell class]) bundle:nil] forCellWithReuseIdentifier:NSStringFromClass([HomeCollectionViewCell class])];
[self.collectionView registerClass:[AttensionCell class] forCellWithReuseIdentifier:NSStringFromClass([AttensionCell class])];
}
当self.hasFollow
变化时,重设flowLayout,然后崩溃👇
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
frame #0: 0x000000018b410a20 UIKit`-[UICollectionViewData layoutAttributesForItemAtIndexPath:] + 248
frame #1: 0x000000018b4ea588 UIKit`-[UICollectionView _setCollectionViewLayout:animated:isInteractive:completion:animator:] + 2284
frame #2: 0x000000018b4e9c84 UIKit`-[UICollectionView _setCollectionViewLayout:animated:isInteractive:completion:] + 84
frame #3: 0x000000018b4e9c10 UIKit`-[UICollectionView setCollectionViewLayout:] + 388
* frame #4: 0x0000000100762a68 deepLeaper`-[AttensionListController setupLayoutAndCollectionView](self=0x00000001557d7e00, _cmd="setupLayoutAndCollectionView") at AttensionListController.m:107:5
frame #5: 0x0000000100762538 deepLeaper`__57-[AttensionListController requestDataComplete:errorInfo:]_block_invoke(.block_descriptor=0x00000001571f7640, hasFollow=YES) at AttensionListController.m:64:9
frame #6: 0x00000001006fcc7c deepLeaper`__65+[CHRequestManager(.block_descriptor=0x00000001557b1830, responseObject=4 key/value pairs) requestHasFollowOnSucceeded:onError:]_block_invoke at CHRequestManager+Content.m:72:13
frame #7: 0x000000010078e730 deepLeaper`__78+[CHRequestManager requestWithRequest:path:method:parameters:success:failure:]_block_invoke(.block_descriptor=0x00000001571f5690, request=0x00000001571882e0) at CHRequestManager.m:61:17
frame #8: 0x000000010082efc4 deepLeaper`__61-[CHBaseRequest startWithCompletionBlockWithSuccess:failure:]_block_invoke(.block_descriptor=0x00000001557eed30, request=0x00000001571882e0) at CHBaseRequest.m:177:13
frame #9: 0x0000000100a84bf0 deepLeaper`__48-[YTKNetworkAgent requestDidSucceedWithRequest:]_block_invoke(.block_descriptor=0x00000001571f3590) at YTKNetworkAgent.m:372:13
frame #10: 0x0000000103ee51dc libdispatch.dylib`_dispatch_call_block_and_release + 24
frame #11: 0x0000000103ee519c libdispatch.dylib`_dispatch_client_callout + 16
frame #12: 0x0000000103ee9d2c libdispatch.dylib`_dispatch_main_queue_callback_4CF + 1180
frame #13: 0x0000000181653070 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
frame #14: 0x0000000181650bc8 CoreFoundation`__CFRunLoopRun + 2272
frame #15: 0x0000000181570da8 CoreFoundation`CFRunLoopRunSpecific + 552
frame #16: 0x0000000183556020 GraphicsServices`GSEventRunModal + 100
frame #17: 0x000000018b590758 UIKit`UIApplicationMain + 236
frame #18: 0x00000001007d1278 deepLeaper`main(argc=1, argv=0x000000016f8d37a8) at main.m:14:16
frame #19: 0x0000000181001fc0 libdyld.dylib`start + 4
怀疑可能是数据清了,cell没清掉时 去设置另一种flowLayout 会导致崩溃
后来在调用之前,reloadData一下就好了
if (self.hasFollow != hasFollow) {
self.dataArray = @[]; //清除
[self.collectionView reloadData]; //加上就不crash了
}
self.hasFollow = hasFollow;
[self setupLayoutAndCollectionView];
网友评论