「Simulate Memory Warning」を正義のハンマーとして使用して、iOS アプリを調べていますが、(当然のことながら) 予期しない問題が発生しています。しかし、これは私を困惑させた 1 つの問題です。オブジェクトは、一見、等しくないように見えます。
私のView Controller(名前を付けますVCBob
)が…</p>
- サブビューとしての2 つの個別のカスタム(これらのビューと
UIViews
名前を付けましょう)viewA
viewB
- それぞれ独自
UICollectionView
のプロパティとして公開されていますcollectionView
(これらは としてUICollectionViews
使用VCBob
されますdelegates
)
- それぞれ独自
- 押された
UIButton
ときに、他のView Controller(それ以外の場合は重要でないもの)をスタックにプッシュする
をタップするUIButton
と、意味のないView Controllerが表示されます。「Simulate Memory Warning」オプションを起動し、完全に再作成されてビュー階層に再挿入されるため (の時点である限り) 、の内部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
プレイに戻ります。2 つのカスタム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
条件は両方とも false と評価されます。何故ですか?で悪いことをしているかもしれないと思っているようですdidReceiveMemoryWarning
。そこでビューを処分するべきではありませんか?