2010-07-27 90 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