Was bedeutet es, einen Rahmen "schwach zu verknüpfen"?
In Xcode kann ich einen Rahmen gesetzt, um "Optionale" statt "Erforderlich", was dann bedeutet, der Rahmen ist schwach verknüpft.
Bedeutet das, dass das framework ist nur im bundle, wenn es importiert wird, irgendwo?
Möchte ich zu weak-link ein paar debugging-frameworks die Verwendung private API, und ich will Sie nicht angezeigt im App-Store aufzubauen.
InformationsquelleAutor der Frage openfrog | 2013-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wichtiger Hinweis:
Diese Antwort wurde geschrieben, bevor iOS 8 angekündigt wurde. Während die technischen details immer noch gelten für system-frameworks ist es nun möglich, erstellen Sie Ihre eigenen, dynamisch verknüpfte Rahmenbedingungen das Schiff in Ihre app-bundle. Gibt es Einschränkungen, z.B. nur eine app und Ihre Erweiterungen können eine Verknüpfung zu der gleichen Instanz der eingebetteten Rahmen, aber die Tatsache bleibt, Benutzerdefiniert, dynamisch verknüpfte Rahmen sind möglich, da iOS 8. Wenn Sie mehr erfahren möchten, finden Sie diese Anleitung (Über einen integrierten Rahmen zu Teilen Code) und WWDC 2014 session 416, Aufbau Moderner Frameworks.
Ursprüngliche Antwort:
Keiner der (Plattform) - frameworks ist wirklich "enthalten im bundle". Anstatt, Ihre app eine Referenz ("link"), um einen Rahmen, sobald Sie es hinzufügen, um die "Link-Binary mit der Bibliothek" build-phase. Die Rahmenbedingungen sind bereits auf den Geräten installiert. Wenn Sie eine app, die alle das app-framework-Referenzen werden aufgelöst, durch den dynamischen linker (auf dem Gerät), was bedeutet, dass der framework-code geladen wird, damit Ihre app verwenden können.
Einige frameworks möglicherweise nicht verfügbar auf allen Geräten, die Sie unterstützen möchten, z.B., PassKit war eingeführt in iOS 6. Wenn Sie eine app, die links gegen PassKit auf einem iOS-5-Gerät, es stürzt direkt nach dem Start, weil der dynamische linker nicht finden können, das framework auf dem Gerät. Allerdings, wenn Sie weak-link-PassKit, der dynamische linker wird alle framework-Symbole, um die
nil
, wenn der Rahmen konnte nicht gefunden werden. Dies verhindert, dass die app abstürzt, und Sie können überprüfen, ob die Symbole' Verfügbarkeit zur Laufzeit, z.B.:[PKPass class]
ist sicher, zu verwenden für alle Geräte/Systeme, da diePKPass
Klasse symbol wirdnil
auf älteren Systemen und messaging -nil
ist nicht ein problem in Objective-C.Mehr auf der Weak-Linking: Apple-Dokumentation
Wirklich Ihre Frage zu beantworten:
Keine. Die Rahmen werden immer Links von der app. Nur, wenn der Rahmen ist nicht auf dem tatsächlichen Gerät Ihre app ausgeführt wird, dann wird das framework nicht geladen werden.
Eine Lösung wäre die separate Ziele für Debug-und App-Store-Erstellt. Eine alternative ist die Verwendung nicht der built-in "Link-Binary mit der Bibliothek" build-phase von Xcode, aber der link zu der Debug-frameworks über linker-Optionen. Diese können angegeben werden für jede Konfiguration (Debug/Release/...) getrennt, etwa so:
Wenn Sie wollen, um zu weak-link, verwenden
-weak_framework PassKit
(PassKit, natürlich nur ein Beispiel... legen Sie den Namen Ihres Rahmens) statt. Wenn Sie das Debug-framework nicht in eines der Standard-framework-Verzeichnisse, die Sie vielleicht haben, um einen vollständigen Pfad oder ändern Sie die Rahmenbedingungen Pfad Suchen. Plus, sollten Sie wahrscheinlich verwenden Sie Makros, um sicherzustellen, dass keiner der code mit der debug-framework(s) macht es für den App Store erstellen.Bearbeiten: eine Weitere option, da Xcode 5 ist die Verwendung
@import <FrameworkName>;
. Auf diese Weise können Sie lassen Sie Ihr "Link-Binary - ..." - phase leer und auslösen der Verknüpfung von frameworks in code. Anschließend können Sie Makros verwenden, wieDEBUG
zu machen sicher, dass einige Rahmenbedingungen nicht verwendet werden, für die App-Store-erstellt. Es gibt eine ausgezeichnete Antwort über@import
.InformationsquelleAutor der Antwort hagi
Traf ich schwach verknüpfen, wenn ich mit iAds. Das problem war, wenn ich starke link iAd-framework und führen Sie die app auf einem Gerät mit SDK nicht unterstützt iAds, dann wird es einfach nur Absturz. Schwache Verknüpfung erlaubt zu vermeiden Abstürze. Ich glaube immer noch, dass Sie auch mit schwachen Verknüpfung, die Sie noch haben, um check-in-code, wenn der Rahmen verfügbar ist oder nicht.
InformationsquelleAutor der Antwort azamsharp
Diese hängt davon ab, wie Sie konfiguriert sind Eure Pläne oder Ziele.
Könnten Sie eine Regelung nur für das debugging und schließt euer optionale Rahmen nur dort. Verwenden Sie ein anderes System, ohne den optionalen Rahmens für die Freigabe.
UPDATE
Dazu, als Basis für Ihr neues System auf einer Projekt-Konfiguration und legen Sie
OTHER_LDFLAGS
wie beschrieben in hagi ' s Antwort.InformationsquelleAutor der Antwort mkalmes