3

我遇到了一个奇怪的问题。我想在我当前的视图中添加一个 UIViewcontroller(称为 iView)。我通过调用来做到这一点

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

在 iView 的 viewDidLoad 中,我将它作为观察者添加到 NotificationCenter 以获得某个通知,像这样

    - (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 类参考的实现容器视图控制器中找到,示例代码可在视图控制器编程指南的创建自定义容器视图控制器中找到。

因此,在 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];

如果这是 iOS 4 或更早版本,则它不支持适当的遏制。您可以手动添加它,通过像您一样添加视图,没有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,但只需将其隐藏即可。然后,当您想要显示它时,取消隐藏它。但是将所有内容保留在父视图控制器中,它是 NIB。我上面描述的伪装遏制的方法可能有效(我见过人们这样做),但它给了我heebie jeebies。这更简单。

于 2013-01-02T15:36:22.067 回答