我正在开发一个我想为iPhone 3.0,iPhone 4.0部署的应用程序,它可以在模拟模式下在iPad上运行。
我正在使用XCode 3.2.3进行开发,我有播放的视频。我想将MPMoviePlayerViewController
用于> = 3.2和MPMoviePlayerController
用于< 3.2。
如果我使用
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil)
{
MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
...
}
带有OS 3.0的iPhone是否能够处理它不知道的类?
将代码置于__IPHONE_OS_VERSION_MIN_REQUIRED > 30200
ifelse块中是否合适?像这样:
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
...
}
但是__IPHONE_OS_VERSION_MIN_REQUIRED
真正做了什么?在我看来,它只是重复我为我的项目设置的设置:min = 3.0
答案 0 :(得分:2)
你对__IPHONE_OS_VERSION_MIN_REQUIRED
是正确的:这只是你在项目中放置的内容。因此,您使用的任何#if
语句都将在编译时进行评估,这不是您想要的。
相反,做你最初做的事情,但做了一些小改动,比如:
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
id moviePlayerViewController = [[mplayerControllerClass alloc] initWithContentURL:movieUrl];
...
}
关键是你不应该单独使用MPMoviePlayerViewController
,即使你已经确认它应该存在(在任何情况下,我认为它不会正确编译/链接)。但是,是的,这将适用于OS 3.0的设备。 (例如,参见Apple的OpenGL ES示例,与CADisplayLink
相同。)
答案 1 :(得分:2)
在您的第一个代码段上,您正在基于NSString
创建一个类。这是可能的,因为您的框架很弱,因此旧版本的操作系统在这种情况下不会崩溃。
这是在运行时完成的,并且可以按预期工作。
另一方面,第二个片段使用预编译器条件。这不会产生任何影响,因为为了使用MPMoviePlayerViewController
,您将使用4.0的Base SDK,因此#if
将始终为真。
结论:弱链接是你想要的,继续你的第一个片段,并确保框架 弱链接。