__IPHONE_OS_VERSION_MIN_REQUIRED请解释

时间:2010-07-27 18:44:07

标签: ios objective-c video version playback

我正在开发一个我想为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

2 个答案:

答案 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将始终为真。

结论:弱链接是你想要的,继续你的第一个片段,并确保框架 弱链接。