2013-08-23 8 views
7

ここに問題があります。私は、iOS 7のいくつかの問題に対処するiOSのアップデートをすぐにリリースする予定です。これを行うには、特定のiOS 7機能/タイプを使用する必要があります。私はiOS 7のコードがiOS 7でのみ実行され、iOS 7よりも前のコードにはフォールバックされることを確信しています。もちろん、私は現在のXcodeのベータ版を提出することはできませんので、コンパイルしようとしています現在のXcodeリリースで誰もが#pragmaを使用して、この警告を無効にする方法を知ってい条件付きでコンパイラからコードを隠す

Use of undeclared identifier '<Redacted>'.

:しかし、私は、この特定の警告を無効にする方法を見つけるように見えることはできません。私は

-Wall-Weverthing

-wなど、さまざまなものの束を試みたが、何も動作していないようにみえます。

UPDATE 回答:コンパイラは、識別子をコンパイルすることはできませんので、あなたは、もちろん、それはについて何も知らないことはできません。私のソリューションは、単に#defineを作成することでした。

#define <redacted> 1

UPDATE 2 以下の答えは実際にははるかに容易になりました。私はすでに#define Xcode5Code(code, alt)を作成しており、条件付きでコードブロックを実行することができました。これは私が簡単に使用することにより、コンパイラからのコードのブロックを非表示にすることができます

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
    #define Xcode5Code(code, alt) code 
#else 
    #define Xcode5Code(code, alt) alt 
#endif 

:@maddyにより溶液を使用して、それを修正することにより

Xcode5Code({ 
    //Code to be execute only with Xcode 5 
}, { 
    //code to be executed in previous versions of Xcode 
}) 

#define Xcode5Codeを使用することの主な利点は、Xcodeがありますあなたのために自動的に完成されます。#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000を使うよりもずっと簡単です.Xcodeは自動完成しません。

これは、iOS 7とiOS 7以前のデバイスを実際に区別しません。現在のXcodeが処理できるiOSのバージョンを区別します。 iOSデバイスのバージョンを区別するために、私は以下を使用します:

NSUInteger DeviceSystemMajorVersion(void) { 
    static NSUInteger _deviceSystemMajorVersion = -1; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue]; 
    }); 
    return _deviceSystemMajorVersion; 
} 

上記はAppleのコードです。 NDAを少し踊るには、使用しているXcodeのバージョンとデバイスに搭載されているiOSのバージョンの両方に依存するため、これがルートコントローラのビューをレイアウトするのに役立つと言います。ベータ版とプロダクションコードを管理しようとしている場合は、これが大いに役立ちます。 Xcode 5でアプリケーションを送信すると、#define Xcode5Codeは不要になります。

+0

これは警告ではなく、エラーです。どのようにコンパイラが知らない識別子を操作するようにしますか? – Mat

+0

それは警告ですか?エラーのように見えます。 – trojanfoe

+0

@Matああ...もちろん、そうです。どうやら今日はもっとコーヒーが必要だと思う。はい、エラーです。もちろん、コンパイラが何も知らないものをコンパイルすることは期待できません。 –

答えて

22

あなたはXcodeのか、二つの異なるベースSDKの設定の2差のバージョンを使用してアプリケーションをコンパイルしたいなら、あなたはコンパイラディレクティブを使用する必要があります。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported 
    // iOS 7 code here 
#else 
    // Pre-iOS 7 code here 
#endif 

は、実行時チェックのためにこれを使用しないでください。このソリューションは、2つの異なるバージョンでコードをコンパイルする必要がある場合にのみ使用します。たとえば、iOS 7コードを追加したが、Xcode 4.6でコードをコンパイルする必要があります。コンパイルディレクティブを使用すると、古いBase SDKを使用してコンパイラからiOS 7コードを「隠す」ことができます。

これと適切なランタイムチェックの詳細については、ドキュメントの「SDK互換性ガイド」を参照してください。