2010-07-27 106 views
3

我开发一个应用程序,我想部署iPhone 3.0,iPhone 4.0,可以在模拟模式,在iPad上运行。__IPHONE_OS_VERSION_MIN_REQUIRED请解释

我用了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真的做什么?在我看来,它只是重复我设置为我的项目的设置:分= 3.0

回答

2

在您的第一个片段中,您将根据NSString创建一个类。这是可能的,因为你连接你的框架很脆弱,这样老版本的操作系统在这种情况下不会崩溃。 这是在运行时完成的,并且可以按照您的预期工作。

第二代码段,在另一方面,使用了预编译器为条件。这不会有任何影响,因为为了让您使用MPMoviePlayerViewController,您将使用4.0的基本SDK,因此#if将始终为真。底线:弱链接是你想要的,继续你的第一个片段,并确保框架弱链接。

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也是如此。)

+0

只要基本SDK是新的,就可以包含新类。查看'MessageUI'的苹果示例代码:http://developer.apple.com/IPhone/library/samplecode/MailComposer/Listings/Classes_MailComposerViewController_m.html#//apple_ref/doc/uid/DTS40008865-Classes_MailComposerViewController_m-DontLinkElementID_6 – pgb 2010-07-27 19:07:57

+0

@pgb,看起来你是对的。如果我只是使用了课堂,我想过我会记得过去发出警告。 – 2010-07-27 20:02:23