总结
CollectionView 常见Crash的原因主要是以下几种
- DataSource的改变和 ViewItem的改变 对应不上
- Collection增删时没有使用 BatchUpdate 导致问题1
- Layout无效
其中最主要的就是问题1, 有很多种情况可以引起,我们根据错误提示解释
plus or minus the number of sections inserted or deleted
1 | Invalid update: invalid number of sections. The number of sections contained in the collection view after the update (3) must be equal to the number of sections contained in the collection view before the update (4), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). |
这个问题都是因为DataSource最终状态和执行insert、delete的预期结果不一致导致的,常见的原因如下
没有使用BathUpdate
如果同时改变Section和Item,则需要注意操作完毕 DataSource 后的方法,例如我们以下操作
- 存在4个section,每个section有5个item
- 删除第二个sect
- 删除第三个section的第一个
此时我们的的输入参数
1 | var sectSet = [1] |
得到了入参数后,错误的方法
1 | //此时DataSource还剩余 3个Section |
应该使用正确的方法, 使用Batch(批量)进行更新
1 | self.collection.performBatchUpdates({ |
操作Section和Item后计算的Index不正确
还有一种常见的错误是构造输入参数时的逻辑错误, 原因是操作DataSource时Index的动态变化
1 | //准备结果容器 |
Heap corruption detected
1 | Heap corruption detected, free list is damaged at 0x600002115bc0 |
也是一种常见的DataSource和ViewCollection没有对齐的错误,常见于Insert操作
如果同时Insert一组Sect和一个Item,恰巧Insert的Item是此前Insert的Sect,导致Sect总数没有变化 导致的
1 |
|
值得一提的是,如果外部没有使用BatchUpdate(上文中错误的用法)才会产生这种Crash
如果使用了 BatchUpdate 则会产生上一个Crash原因
non-nil layout parameter
1 | UICollectionView must be initialized with a non-nil layout parameter |
通常是使用了错误的初始化方法,正确的方式是
1 | //根据layout初始化 |