memory - 未收到 addSubview 通知

标签 memory notifications autorelease ios4 addsubview

我遇到了一个奇怪的问题.. 我想向我当前的 View 添加一个 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 上的自动释放方法时,从未捕获到通知(因此永远不会调用设置方法),但如果我不为 iView 调用自动释放方法,它就会起作用。

我不明白这种情况下的内存管理,谁能帮我理解一下?

最佳答案

容器 View Controller 方法在 Implementing a Container View Controller 中找到UIViewController 类引用 和示例代码可以在 Creating Custom Container View Controllers 中找到View Controller 编程指南。

因此,在 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 或更早版本,它不支持适当的包含。您可以像现在一样添加 View ,无需 autorelease 即可手动拼凑它:

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

您显然会在父 View Controller 的某个 ivar 中保留 subview Controller 的副本,而不是 autorelease 它,而是显式地 release 子 Controller child 的意见被驳回。请注意,由于您在 iOS4 前的世界中运行,因此不能保证您的子 Controller 会收到各种事件(众所周知的旋转事件)。但是您应该会收到您的通知中心事件。


在 iOS 4 中尝试伪造包含的这种丑陋行为的替代方法是根本不使用 subview Controller ,而只是将 subview 添加到父 View 。您实际上可以将它添加到父 Controller 的 NIB,但只是隐藏它。然后,当您想要显示它时,取消隐藏它。但是将所有内容都保留在父 View Controller 中,它是 NIB。我在上面描述的方法,伪造遏制,可能会奏效(我见过有人这样做),但它让我很讨厌。这样比较简单。

关于memory - 未收到 addSubview 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124523/

相关文章:

java - 声明字符串对象的混淆

javascript - 'memory leak'是什么?这是性能问题还是安全问题?

java - 通知在特定时间自动取消

Objective-C 内存管理(分配和自动释放)

objective-c - 为什么在使用本地变量后不久经常调用 release 而不是自动释放

c# - 获取已加载程序集的内存地址

java - 组织大量方法的最有效方法是什么?

Azure 通知中心 : The supplied notification payload is invalid

Android: Intent 通过通知传递给 Activity ......我没有在 Intent 中获得正确的额外内容

bash - Github:使用 Bash 上传发布 Assets