2016-03-25 3 views
0

10.8 + requimentsのアプリを書いています。 は、今私は、10.8より上のOS X用のNSURLSessionを使用して、私は2つのHTTPクライアントを持つOS X 10.8 のみOS X 10.8でのみNSURLSessionをインポートしますが、使用しないでください

ためNSURLConnectionを使用したいです。スーパークラスNSURLSessionManagerを持つhttpClientAとスーパークラスNSURLConnectionを持つhttpClientB。システムのバージョンが10.8を超えていることを確認すると、httpClientBが使用されます。それが私が望むものです。

しかし、私のアプリは10.8システム上で起動したときに、それだけでクラッシュし、それは私がX 10.8のOS上で、NSURLSessionTransferSizeUnknownはdoesnのシンボルがまったく存在していることを知っているシンボル

Dyld Error Message: Symbol not found: _NSURLSessionTransferSizeUnknown Referenced from: path/to/my/app Excepted in: /System/Library/Frameworks/Foundation.framework/Version/C/Foundation

を見つけることができないと言うが、私はこのシンボルを使用するコードセクションを実行しました。だから私はこれを避けることができますか?起動時にそれを聞かせて、すべてが大丈夫です(私だと思います)

または実行時のトリック/チェックがありますか?

ありがとうございました!

UPDATE

私は弱いリンクを使用することによって、この問題を解決するか、PCHファイルにNSURLSession @class を置きます。

問題は、私はそれらの実行時チェックを行っている私の.mファイルに

@import <3rd-part-lib1.h> @import <3rd-part=lib2.h> - (void)someMethod:() { if (above 10.8) { do staffs with a 3-rd part library's object whose superClass is NSURLSession } else { do staffs with a 3-rd part library's object whose superClass is NSURLSession } }

です。 NSURLSessionクラスを探していないリンクに@classを使用するだけです。それが必要なときにそこにいるだろう。しかし10.8では、私はNSURLSessionを持っており、私はそれを使用しません。

答えて

0

これは弱い結合で解決されます。フレームワークが弱くリンクされている場合、シンボルが実際には存在しない場合でも、そのシンボルはすべてコンパイルおよびリンクできます(エクスポートされたC変数および関数を含む)。

リンカオプションで-framework Foundation-weak_framework Foundationに置き換えてください(またはXcode UIの 'weak'フラグを設定してください)。

Objective-Cクラスは、if ([NSNewClass class])でテストできます。

エクスポートされたCシンボルは、if (&NSURLSessionTransferSizeUnknown != NULL)でテストする必要があります。

!= NULLと書かなければならないことに注意してください.は何らかの理由で使用できません(オプティマイザ?)。

+0

それは私が意味するものではありません。私の答えを参照してください:) – sunus

0

実行中のOS Xのバージョンを確認するには、NSAppKitVersionNumberを使用します。 このように

if (NSAppKitVersionNumber > NSAppKitVersionNumber10_8) 
{ 
    execute code related to OS X 10.9 and higher 
} 
関連する問題