gpt4 book ai didi

memory - 未收到 addSubview 通知

转载 作者:行者123 更新时间:2023-12-02 05:03:25 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题..我想向我当前的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com