3

奇妙な問題に直面しています。現在のビューにUIViewcontroller(iViewと呼ばれます)を追加したいと思います。私は電話でそれをします

   iView = [[KFKaraokeInfosView alloc] initWithKaraoke:karaoke NibName:@"InfosView" commingFromPlayer:NO];
    iView.songTitle.text = karaoke.title;
    [self.view addSubview:iView.view];

iViewのviewDidLoadで、このように特定の通知の通知センターにオブザーバーとして追加します

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        self.title = @"About";

        if ([karaoke.styles count] == 0)
        {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"GetInfosOfSong" object:self.karaoke];
        }
        else
        {
            shouldSetup = YES;
        }

        [self.navigationController setNavigationBarHidden:NO animated:YES];
        [self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setup) name:GetSongInfos  object:nil];
        [optionsTableView setBackgroundView:nil];

    }

問題は、初期化時にiViewでautoreleaseメソッドを呼び出すと、通知がキャッチされない(つまり、setupメソッドが呼び出されることはない)が、iViewのautoreleaseを呼び出さない場合は機能することです。

この状況でのメモリ管理がわかりません。誰かが私を理解するのを手伝ってくれますか?

4

1 に答える 1

0

コンテナビューコントローラのメソッドは、UIViewControllerクラスリファレンスのコンテナビューコントローラの実装にあり、サンプルコードは、ViewControllerプログラミングガイドのカスタムコンテナビューコントローラの作成にあります。

したがって、iOS 5以降では、おそらく次のようになります。

iView = [[[KFKaraokeInfosView alloc] initWithKaraoke:karaoke NibName:@"InfosView" commingFromPlayer:NO] autorelease];
[self addChildViewController:iView];
iView.songTitle.text = karaoke.title;
[self.view addSubview:iView.view];
[iView didMoveToParentViewController:self];

これがiOS4以前の場合、適切な封じ込めをサポートしていません。自分のようにビューを追加することで、手動でそれを恨むことができますautorelease

iView = [[KFKaraokeInfosView alloc] initWithKaraoke:karaoke NibName:@"InfosView" commingFromPlayer:NO];
iView.songTitle.text = karaoke.title;
[self.view addSubview:iView.view];

明らかに、子ビューコントローラのコピーを親ビューコントローラの一部のivarに保持しますが、それではなく、子のビューが閉じられたときに子のコントローラをautorelease明示的に保持します。release封じ込め前のiOS4の世界で操作しているため、子コントローラーがさまざまなイベント(悪名高いローテーションイベント)を受信することが保証されていないことに注意してください。ただし、通知センターのイベントを受信する必要があります。


iOS 4で封じ込めを偽造しようとするこの醜いことに代わる方法は、子ビューコントローラーをまったく使用せず、子ビューを親ビューに追加することです。実際には親コントローラーのNIBに追加できますが、非表示にするだけです。次に、表示する場合は、再表示します。ただし、すべてを親ViewControllerに保持してください。これはNIBです。私が上で説明した封じ込めを偽造する方法はうまくいくかもしれませんが(私は人々がそれをするのを見ました)、それは私にheebiejeebiesを与えます。これはもっと簡単です。

于 2013-01-02T15:36:22.067 に答える