我正在浏览我的 iOS 应用程序,使用“模拟内存警告”作为我的正义之锤,这会导致一些意想不到的问题(自然)。但这是让我难过的一个问题:对象似乎不再相等。
假设我的视图控制器(我们将命名它VCBob
)有……</p>
- 两个单独的自定义
UIViews
子视图(让我们命名这些视图viewA
和viewB
)- 每个都有自己
UICollectionView
暴露的属性collectionView
(这些UICollectionViews
用作VCBob
他们的delegates
)
- 每个都有自己
- 一个
UIButton
,当按下时,将其他一些视图控制器(否则无关紧要)推到堆栈上
所以我点击了,UIButton
然后出现了无关紧要的视图控制器。我触发了“模拟内存警告”选项,并被VCBob
编程为在 中删除viewA
和viewB
内部-didReceiveMemoryWarning
,因为它们被完全重新创建并重新插入到视图层次结构中viewWillAppear
(只要它们nil
在 时viewWillAppear
)。这是该实现VCBob
:
- (void)didReceiveMemoryWarning {
BOOL hasSuperview = self.view.superview != nil;
[super didReceiveMemoryWarning];
if (!hasSuperview) {
_viewA = nil;
_viewB = nil;
}
}
然后我点击导航栏中的后退按钮,然后VCBob
重新开始游戏。这两个自定义UIViews
仍然存在,并且它们各自UICollectionViews
都加载了内容。当我点击UICollectionViewCells
任一集合视图中的一个时,该-collectionView:didSelectItemAtIndexPath:
方法被调用VCBob
;到目前为止,一切都很好。该实现看起来像这样。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
if (collectionView == self.viewA.collectionView) {
NSLog(@"Do something here!");
} else if (collectionView == self.viewB.collectionView) {
NSLog(@"Do something else here!");
}
}
问题是什么都没有发生——没有任何记录。这两个if
条件都评估为假。这是为什么?我似乎觉得我可能在做坏事didReceiveMemoryWarning
。我不应该在那里处理视图吗?