自定义UICollectionViewLayout错误:发送到解除分配的实例的UICollectionViewLayoutAttributes副本

时间:2013-11-08 21:33:57

标签: ios objective-c uicollectionview uicollectionviewlayout

我有一个自定义的UICollectionViewLayout子类。调用prepareLayout时,它会为单元格创建布局属性并缓存它们,然后在适当的时间返回它们。一切正常。

我最近在shouldInvalidateLayoutForBoundsChange中添加了一个覆盖:这样当布局由于设备旋转而改变比例时,它将很好地布局。我现在看到的是,应用程序有时会崩溃并显示一条消息: “[UICollectionViewLayoutAttributes copy]:发送到解除分配实例的消息”。在旋转事件期间收到新数据时会发生这种情况。

据我所知,这是因为iOS在收到数据并调用prepareLayout之后将[copy]发送到我从layoutAttributesForItemAtIndexPath:方法返回的UICollectionViewLayoutAttributes对象。但是我不明白为什么iOS不会立即复制该项目,或者如何在返回它之后保留适当的时间而不会泄漏内存。

所以回顾一下:

- prepareLayout {
    self.myCellAttributes = [NSMutableArray array];

    // calculate UICollectionViewLayoutAttributes for each cell, 
    // and store each in appropriate location ala:
    self.myCellAttributes[itemIndex]
}

- layoutAttributesForItemAtIndexPath:(NSIndexPath*)indexPath {
    // return appropriate attributes ala:
    return self.myCellAttributes[itemIndex];
}

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    CGRect oldBounds = self.collectionView.bounds;
    return CGRectGetHeight(newBounds) != CGRectGetHeight(oldBounds);
}

我最初的修复尝试是:

-(void)prepareForAnimatedBoundsChange:(CGRect)oldBounds {
    self.retainedAttributes = self.myCellAttributes;
}
-(void)finalizeAnimatedBoundsChange {
    self.retainedAttributes = nil;
}

有人认为我会保留我在动画期间返回的对象,所以如果在发生这种情况时新数据进入,则不会出现问题。这对行为没有任何明显的影响,所以我不知道如何确保属性在正确的时间内保留。

所以暂时,我只是为了返回noInvalidateForBoundsChange的NO,它会删除崩溃并且工作正常,除了单元格“捕捉”到新的大小而不是平滑过渡。

非常感谢任何建议/建议/指示。

0 个答案:

没有答案