gpt4 book ai didi

ios - didReceiveMemoryWarning 和重建实例变量相等性检查

转载 作者:行者123 更新时间:2023-11-29 13:14:00 29 4
gpt4 key购买 nike

我正在检查我的 iOS 应用程序,使用“模拟内存警告”作为我的正义之锤,它导致了一些意想不到的问题(自然)。但这是一个让我难过的问题:对象似乎不再相等。

假设我的 View Controller (我们将其命名为 VCBob)有...

  • 两个独立的定制UIViews作为 subview (让我们将这些 View 命名为 viewAviewB )
    • 每个人都有自己的UICollectionView作为属性(property)公开 collectionView (这些 UICollectionViews 使用 VCBob 作为他们的 delegates )
  • 一个UIButton按下时,将其他一些 View Controller (一个无关紧要的 View Controller )推送到堆栈上

所以我点击 UIButton微不足道的 View Controller 来了。我关闭“模拟内存警告”选项,然后 VCBob被编程为放弃 viewAviewB -didReceiveMemoryWarning 内部,因为它们正在完全重新创建并重新插入到 viewWillAppear 上的 View 层次结构中(只要它们在 nil 时是 viewWillAppear )。这是 VCBob 中的实现:

- (void)didReceiveMemoryWarning {
BOOL hasSuperview = self.view.superview != nil;
[super didReceiveMemoryWarning];

if (!hasSuperview) {
_viewA = nil;
_viewB = nil;
}
}

然后我点击导航栏中的后退按钮,然后 VCBob重新发挥作用。二次定制UIViews还在那里,他们各自的UICollectionViews加载内容。当我点击其中一个 UICollectionViewCells在任一 Collection View 中,-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 .我不应该在那里处理意见吗?

最佳答案

如果 _viewA 在一个 View 层级中,它会被它的父 View 保留,所以做 _viewA = nil 不会释放它,当viewWillAppear 方法被触发。

然后,在您的 viewWillAppear 中,您将添加一个 viewA 的“副本”,里面有自己的 collectionView,刚好放在原始 View 之上:您看到一个 View , 但实际上它们是两个重叠的 View 。

所以,你应该在你的 didReceiveMemoryWarning 方法中添加一个 removeFromSuperview 调用来摆脱这个

viewB 也是如此。

关于ios - didReceiveMemoryWarning 和重建实例变量相等性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325581/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com