編集
RefCt を保持しているため、画面が nil にならないことがわかりましたが、RefCt が 0 でないのはなぜですか? ビューを作成、追加、削除するだけです。インストゥルメントのスクリーンダンプも追加しました:
だから、あなたは最初に見ます
Malloc 1 initwithframe、retain: 2 initwithframe、release :1 -[UIView(Internal) _addSubview:positioned:relativeTo:]、retain : 2 Quartzcore CALAyer layoutSublayers、retain: 3 Quartzcore CALAyer layoutSublayers、release: 2 次に、コードでこれを削除しますビュー、removeFromSuperView: 1
誰かがこれを説明できますか:
-[UIView(Internal) _addSubview:positioned:relativeTo:], retain : 2
ライン?これが、私のビューにまだ RefCt がある理由だと思います。
終わり
コードをきれいにして、最終的にアプリを高速化しようとしていますが、メモリ管理全体を本当に理解しているとは思いません。基本的に、私のアプリにはユーザーに表示されるビューが 1 つありますが、ユーザーがメニューで選択した内容に応じて別のビューに切り替えることができます。現在、最も論理的なのは、一度に 1 つのビューのみを割り当ててメモリ スペースを占有し、ユーザーが別のビューを選択すると、現在のビューを解放し、選択したビューを割り当てる必要があるということです。新しいビューを選択するときに次のようなことをして、これを作成しようとしました:
- (void)removeMenus {
@autoreleasepool {
for (UIView *view in container.subviews) {
NSLog(@"View to be removed: %@", view);
[view removeFromSuperview];
}
}
}
ユーザーが再びスタートスクリーンを表示することを選択したとしましょう。このコードは実行されます:
- (void)createStartScreen {
if (startScreen == nil) {
startScreen = [[StartScreen alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
startScreen.delegate = self;
startScreen.layer.shadowColor = [[UIColor blackColor] CGColor];
startScreen.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
startScreen.layer.shadowRadius = 5.0f;
startScreen.layer.shadowOpacity = 1.0f;
}
}
私はそこにブレークポイントを置き、スーパービューから削除したためだと思っていたのに、startscreen が nil ではないことを発見しました (また、その var のポインターを削除しようとしました)。私がこれを正しく理解している場合、startscreen の保持カウントはゼロではありませんか? また、私はARCを使用しているので、ARCがこれをうまく処理すると思いました。
メモリを保持するために、ユーザーに表示されなくなったビューを解放する正しい方法は何ですか?