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