gpt4 book ai didi

objective-c - ios sdk 在将选项卡栏附加到主窗口之前在 View Controller 中附加并播放视频文件

转载 作者:行者123 更新时间:2023-11-29 04:31:27 25 4
gpt4 key购买 nike

我有一个非 ARC 项目。所以我正在维护它的内存管理。它有一个选项卡栏和导航 Controller 。在启动时,在显示选项卡栏之前,我必须显示 5 秒的启动视频之类的东西。所以我有两个问题

在将选项卡栏 Controller 附加到主窗口之前显示 View Controller 而不会泄漏的最佳且简单的方法。以下是我当前的技术和代码,但代码分析器向我显示了视频 Controller 中潜在的泄漏。

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];

UIViewController *viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] ;
myNavigationController = [ [ UINavigationController alloc ] initWithRootViewController: viewController ];
[viewController release];

NSMutableArray *viewControllers;
viewControllers = [[NSMutableArray alloc] init];
[viewControllers addObject: myNavigationController]; //Tab 1
myNavigationController release];
// ADD Tab 2 //ADD Tab 3 //ADD Tab 4
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.viewControllers = viewControllers;
[viewControllers release];
//Add video contoller before showing tabs
self.videoController = [[VideoPlayViewController alloc] initWithNibName:@"VideoPlayViewController" bundle:nil];
[self.window addSubview:videoController.view];
[self.window makeKeyAndVisible];

这是我的视频播放器 Controller 代码

- (void)viewDidLoad
{
[super viewDidLoad];
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:@"some url"];
//------ init code in between and added observer to movie playback finish callback ------
[self.view addSubview:moviePlayer.view ]; //show potential leak here if i not release moviePlayer
//[moviePlayer release]; //if i release here controller show me black window with no video playing
}

- (void) moviePlayBackDidFinish:(NSNotification*)notification {

MPMoviePlayerController *player = [notification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerDidExitFullscreenNotification
object:nil];
[player stop];
[player.view removeFromSuperview];
[player release]; //show incorrect decrement of reference count of an object that is not owned at this point by caller
//Fire notification to add tab bar as root view controller
}

播放视频后,我会在我的应用程序代理中收到通知,然后

 [videoController.view removeFromSuperview];
[self.videoController release];
self.videoController = nil;
self.window.rootViewController = self.tabBarController;

和我的主应用程序委托(delegate)像往常一样释放

- (void)dealloc {
[_window release];
[_tabBarController release];
[super dealloc];
}

我认为我正确地解释了我的问题。请任何人有更好的方法来做到这一点。

谢谢

最佳答案

viewDidLoad 之外声明 moviePlayer 变量,然后在 moviePlayBackDidFinish 中释放它。您要添加对它的引用,然后仅删除该引用。您收到有关泄漏的通知的原因是 moviePlayer 从未发布 - 并且根据您当前的代码设置,您无法发布它。

MPMoviePlayerController *moviePlayer; //keep reference to moviePlayer
- (void)viewDidLoad
{
[super viewDidLoad];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:@"some url"];
[self.view addSubview:moviePlayer.view ];
}

- (void) moviePlayBackDidFinish:(NSNotification*)notification {

[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerDidExitFullscreenNotification
object:nil];
[moviePlayer stop];
[moviePlayer.view removeFromSuperview];
[moviePlayer release];
}

关于objective-c - ios sdk 在将选项卡栏附加到主窗口之前在 View Controller 中附加并播放视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687907/

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