setCollectionViewLayout 上的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】setCollectionViewLayout 上的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS on setCollectionViewLayout 【发布时间】:2012-11-01 16:56:34 【问题描述】:

如果我在方向更改期间更改 UICollectionView 的布局,我会在几轮旋转后得到 EXC_BAD_ACCESS

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
    UICollectionViewLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    self.myCollectionView.collectionViewLayout = layout; // This causes EXC_BAD_ACCESS after a few rotations

这是UICollectionView 错误吗?还是我做错了什么?如果是错误,有没有办法在方向更改期间更改整个布局?

我注意到answer 中提到了同样的问题。使用 NSZombies 进行调试不会产生额外的信息。

【问题讨论】:

有没有想过这个问题?我在使用[collectionView setCollectionViewLayout:layout animated:animated] 更改布局时遇到了类似的问题。回溯看起来像:* thread #1: tid = 0x1c03, 0x01780098 libobjc.A.dylib`objc_msgSend + 12, stop reason = EXC_BAD_ACCESS (code=1, address=0xc0000000) frame #0: 0x01780098 libobjc.A.dylib`objc_msgSend + 12 frame #1: 0x008f6ed5 UIKit`-[UICollectionViewData _setLayoutAttributes:atGlobalItemIndex:] + 62 frame #2: 0x008f80f6 UIKit`__45-[UICollectionViewData validateLayoutInRect:]_block_invoke_0 + 1004 可能与***.com/questions/15786084/…有关,也仍然开放。 有没有使用这种布局的 UIDynamicAnimator 呢? (编辑:如果这是 10 个月前发布的,我想不会。) 完全相同的问题和回溯。旋转设备时我正在更改布局。但就我而言,即使它是我的应用用户报告的首要崩溃,我也无法重现。 我仍然有相同的堆栈跟踪。我仍然无法解决这个问题。有人解决了吗? 【参考方案1】:

不太确定它有什么事情要做,但Release Notes for ios 6 说:

willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:,和 didRotateFromInterfaceOrientation: 方法不再被调用 对自身进行全屏展示的视图控制器——对于 例如,presentViewController:animated:completion:

您应该确保您的应用没有使用这些方法来管理任何子视图的布局。相反,他们应该使用视图 控制器的viewWillLayoutSubviews 方法并使用调整布局 视图的边界矩形。

由于您使用的是UICollectionView 可能您正在使用此方法更改其布局。

【讨论】:

我认为情况并非如此,因为有问题的视图控制器是主视图控制器,而不是通过 presentViewController:animated:completion: 呈现。

以上是关于setCollectionViewLayout 上的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

执行 setCollectionViewLayout 时 UICollectionViewCel 中的布局看起来很奇怪

使用 setCollectionViewLayout 会导致崩溃,说 layoutAttributesForItemAtIndexPath not found

UICollectionView.setCollectionViewLayout上的EXC_BAD_ACCESS错误

在UICollectionView上动态设置布局会导致无法解释的contentOffset更改

UICollectionView 更改布局 - 更改单元格

更改布局时 UICollectionViewLayout 不更新 zIndex