0

編集

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がこれをうまく処理すると思いました。

メモリを保持するために、ユーザーに表示されなくなったビューを解放する正しい方法は何ですか?

4

2 に答える 2