关于使用UICollectionView 的时候
在运行过程当中cpu计算量突然暴增,导致线程卡死,打断点的时候发现
- (CGSize)collectionView: layout: sizeForItemAtIndexPath:
这个方法调用过后进行不到下一步操作了.之后CPU突然的暴增.
出现问题的原因:
我在
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
NSInteger rows = (self.ary.count - 1) / 5 + 1;
return CGSizeMake(SCREEN_WIDTH - 40, kBaseScale(85) * rows - kBaseScale(10));
}
这个方法当中有一句话是 NSInteger rows = (self.ary.count - 1) / 5 + 1;
在步进的时候发现当self.ary.count = 0
的时候row
的数据出现异常,变得非常的大.通过NSLog打印出来的数据没有异常.
通过查看NSArray的API我们发现,NSArray的count属性是NSUInteger.NSUInteger是无符号的,即没有负数,NSInteger是有符号的,所以NSUInteger类型不能给它赋负值。
例如:
在NSUInteger a = 0 - 1;
中a
的值实际就是18446744073709551615
所以在上面计算公式中,由于数据类型不同造成数据溢出从而导致计算出现问题,而异常庞大的数据是进一步导致CPU计算量异常庞大.
解决办法如下:
NSInteger count = self.ary.count;
NSInteger rows = (count - 1) / 5 + 1;
return CGSizeMake(SCREEN_WIDTH - 40, kBaseScale(85) * rows - kBaseScale(10));
验证方法如下
NSUInteger a = (0 - 1);
NSLog(@"%lu",(unsigned long)a);