2016-03-25 15 views
0

Ich schreibe eine App mit 10.8 + requiments. Jetzt möchte ich NSURLSession für os x über 10,8 verwenden und NSURLConnection für os x 10.8 verwenden nurImportieren Sie nur NSURLSession in OS X 10.8, aber verwenden Sie nicht

ich zwei HTTP-Client haben. httpClientA mit superClass von NSURLSessionManager und httpClientB mit superClass NSURLConnection. wenn ich überprüfe, dass Systemversion über 10.8 ist, dann verwende ich httpClientB. das ist, was ich will.

aber, wenn mein app auf 10,8 System starten, es nur zum Absturz bringen und sagt, es ist nicht Symbol

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

ich weiß, dass x 10.8 auf o, das Symbol überhaupt NSURLSessionTransferSizeUnknown doesn existiert finden kann, aber Ich bin in einen Codeabschnitt gelaufen, der dieses Symbol benutzt. Wie kann ich das vermeiden? lass es einfach nicht beim Start, und alles wird in Ordnung sein. (Ich denke)

oder, gibt es irgendeine Laufzeit Trick/Check kann ich verwenden?

danke!

UPDATE

i löste dieses Problem durch schwaches Glied oder @class NSURLSession in einer pch Datei gesetzt werden.

das Problem ist in meiner .m-Datei

@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 } }

ich diese Laufzeitprüfungen getan haben. und verwenden Sie einfach @class, um den Link anzugeben, der nicht nach der NSURLSession-Klasse sucht. Es wird da sein, wenn ich es brauche. aber in 10.8, ich habe NSURLSession und ich werde es nicht verwenden.

Antwort

0

Dies ist mit schwachen Verknüpfung gelöst. Wenn ein Framework schwach verknüpft ist, können alle seine Symbole kompiliert und verknüpft werden (einschließlich exportierter C-Variablen und Funktionen), auch wenn sie nicht vorhanden sind.

Ersetzen Sie -framework Foundation durch -weak_framework Foundation in Linker-Optionen (oder setzen Sie "schwach" -Flag in Xcode UI).

Die Verfügbarkeit von Objective-C-Klassen kann mit if ([NSNewClass class]) getestet werden.

Die Verfügbarkeit der exportierten C-Symbole muss mit if (&NSURLSessionTransferSizeUnknown != NULL) getestet werden.

Beachten Sie, dass Sie != NULL schreiben müssen, Sie können nicht nur if (&NSURLSessionTransferSizeUnknown) aus irgendeinem Grund verwenden (Optimierer?).

+0

es ist nicht was ich meine. sehe meine Antwort :) – sunus

0

Um festzustellen, auf welcher OS X-Version läuft, können Sie NSAppKitVersionNumber verwenden. So,

if (NSAppKitVersionNumber > NSAppKitVersionNumber10_8) 
{ 
    execute code related to OS X 10.9 and higher 
}