【发布时间】:2013-08-13 21:38:14
【问题描述】:
我的 UICollectionView 发生了奇怪的崩溃。 崩溃的 UICollectionView 嵌入在另一个 UICollectionView 的 UICollectionView 单元格中。
我无法重现该问题,如果内部 UICollectionView 得到新初始化,有时似乎会发生,因为外部 CollectionView 正在重新加载它的单元格。
com.apple.main-thread 崩溃 0 libobjc.A.dylib objc_msgSend + 9 1 UIKit-[UICollectionViewData _setLayoutAttributes:atGlobalItemIndex:] + 60 2 UIKit __45-[UICollectionViewData validateLayoutInRect:]_block_invoke_0 + 668 3 UIKit-[UICollectionViewData validateLayoutInRect:] + 1408 4 UIKit-[UICollectionViewData layoutAttributesForElementsInRect:] + 82 5 UIKit-[UICollectionView setCollectionViewLayout:animated:] + 1644 6 MyApp BSCTopnewsCollectionView.m 第 52 行 -[BSCTopnewsCollectionView setupBSCTopnewsCollectionView] 7 MyApp BSCTopnewsCollectionView.m 第 27 行 -[BSCTopnewsCollectionView setWeakDelegatePointer:] 8 Myapp BSCFrontPageViewController.m 第 550 行-[BSCFrontPageViewController collectionView:cellForItemAtIndexPath:] 9 UIKit-[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:] + 252 10 UIKit-[UICollectionView _updateVisibleCellsNow:] + 2672 11 UIKit-[UICollectionView layoutSubviews] + 214 12 UIKit-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 258 13 QuartzCore -[CALayer layoutSublayers] + 214 14 QuartzCore CA::Layer::layout_if_needed(CA::Transaction*) + 460 15 QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16 16 QuartzCore CA::Context::commit_transaction(CA::Transaction*) + 238 17 QuartzCore CA::Transaction::commit() + 316 18 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 60 19 核心基础 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20 25 UIKit UIApplicationMain + 1120 26 MyApp main.m 第 16 行 main 异常类型: EXC_BAD_ACCESS 代码: KERN_INVALID_ADDRESS 在 0x158848我在 setupBSCTopnewsCollectionView 第 52 行所做的是
BSCInfiniteLayout *infiniteLayout = [[BSCInfiniteLayout alloc] init]; (第 52 行)self.collectionView.collectionViewLayout = 无限布局;编辑:-[BSCFrontPageViewController collectionView:cellForItemAtIndexPath:]
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
if([collectionView isEqual:self.collectionView])
{
if(indexPath.row == 0) // Header Cell
{
BSCTopnewsCollectionView *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BSCHeaderReuseIdentifier forIndexPath:indexPath];
cell.dataSource = self;
cell.weakDelegatePointer = self;
self.topNewsCollectionView = cell;
return cell;
}
else
{
//create normal cells
}
}
else if ([collectionView isEqual:self.topNewsCollectionView.collectionView])
{
BSCTopNewsHeaderCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BSCTopNewsCellReuseIdentifier forIndexPath:indexPath];
BSCNews *topnews = [self.topNews objectAtIndex:indexPath.row];
[cell setEntity:topnews];
return cell;
}
}
这里对方法调用的一些说明:
- (void)setWeakDelegatePointer:(BSCFrontPageViewController *)weakDelegatePointer
{
_weakDelegatePointer = weakDelegatePointer;
[self setupBSCTopnewsCollectionView];
[self.collectionView reloadData];
}
- (void)setupBSCTopnewsCollectionView
{
self.collectionView.delegate = self.weakDelegatePointer;
self.collectionView.dataSource = self.weakDelegatePointer;
BSCInfiniteLayout *infiniteLayout = [[BSCInfiniteLayout alloc] init];
infiniteLayout.delegate = self;
// Setup Layout
self.collectionView.collectionViewLayout = infiniteLayout;
self.collectionView.showsHorizontalScrollIndicator = NO;
self.collectionView.pagingEnabled = YES;
// Register Cells
[self.collectionView registerNib:[UINib nibWithNibName:@"BSCTopNewsHeaderCell" bundle:nil] forCellWithReuseIdentifier:BSCTopNewsCellReuseIdentifier];
}
Edit3:崩溃似乎只发生在特殊场合。 如果应用程序在后台,但仍在内存中并且用户再次打开它。然后它会检查我们的 API 是否有新数据,如果发现某些东西会加载它们并重新加载整个 outer collectionView。那就是崩溃发生的时候。
如果在应用程序运行时重新加载 CollectionView 而不是一开始就在后台,一切都很好。
为了使设置更清晰。
【问题讨论】:
-
你试过用僵尸吗?
-
可以发
BSCInfiniteLayout的相关方法吗?具体来说,-validateLayoutInRect:和-layoutAttributesForElementsInRect:。 -
@Macmade 我做到了,但是当调试器运行时我无法重现该问题。
-
@Caleb 这两种方法在我的实现中都没有被覆盖。
-
我也有同样的问题。有人找到解决方案了吗?第一个答案只是一个不同的实现,但如果我们不使用 Xibs 怎么办?
标签: ios objective-c uikit uicollectionview exc-bad-access