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错误