2016-01-03 18 views
6

Come ho capito il grande cambiamento da ios framework dinamico e statico è che statico è collegato staticamente al codice al momento del collegamento (prima del lancio) e dinamico è collegato all'avvio/runtimeUtilizzare il framework di terze parti che è incorporato nel framework dinamico

Ora ho un progetto di test:

Il mio progetto ha un quadro dinamico ad esso collegato - A.framework.

import A.framework

A.framework disporre di un quadro integrato all'interno di esso - B.framework

Nel mio progetto principale che voglio utilizzare le classi da B.framework

ora vedo che con un semplice dichiarazione di importazione nel progetto principale:

import B.framework 

e 'effettivamente funziona e posso usare il codice all'interno del B.framework che è incorporato in A.framework collegato

Come può essere? è qualcosa che è sicuro e affidabile da usare? In che modo il progetto principale riconosce il B.framework?

E i casi in cui il progetto principale collega direttamente il B.framework al progetto? in questo caso vedo molti "errori simbolo duplicati" in fase di collegamento

soprattutto come posso costruire A.framework pur non incorporando B.framework all'interno di esso, mentre fuori rotta utilizzando le sue classi e funzioni

Qualsiasi chiarimento aiuterà :)

risposta

7

Come si nota, il collegamento di B.framework porterebbe a simboli duplicati. Questo è il motivo per cui A.framework non dovrebbe incorporare B.framework. Non è mai necessario incorporare un framework in un altro framework se esiste qualsiasi possibilità che l'applicazione che consuma si preoccupi del framework incorporato (in pratica, ciò significa che in realtà non si dovrebbe mai farlo).

A. struttura non correttamente inserita. Se lo hai impacchettato, dovresti rimuovere il framework incorporato e collegare tutto a livello di applicazione. Se qualcun altro lo ha impacchettato, dovresti aprire un problema con loro per correggere questo errore. Questo problema non è nuovo per i framework dinamici. Era ugualmente un problema con le strutture statiche. L'unico momento appropriato per collegare le dipendenze è a livello di applicazione.

(c'è un'eccezione se si controlla l'intero ecosistema (ad esempio Apple) Poi le cose come umbrella frameworks sono accettabili ma non sei di Apple...)

EDIT: E 'ok per collegare, ma non incorporare , una struttura condivisa in un'altra struttura condivisa. La chiave è che l'unica copia del framework condiviso deve provenire dall'applicazione di livello superiore. Dato che il passaggio del collegamento finale avverrà al caricamento, non avrai simboli duplicati perché c'è solo una copia del framework condiviso. Basta non incorporare il sotto-quadro nel tuo.

Ad esempio:

  • creare il progetto con l'obiettivo quadro
  • Trascinate GMA.target framework to framework (questo lo farà linkare ma non embed)
  • Crea target App
  • Avere collegamento app sia GMA.framework che framework di test. Funzionerà bene senza collisioni perché esiste solo un GMA.framework ed è incorporato solo nell'app.
+0

Ma cosa succede se devo usare il codice di B.framework nel mio A.framework? Se non collego B.framework a A.framework, non posso usare la sua funzionalità che in questo caso non riesco a implementare me stesso dal momento che si tratta di un framework di terze parti –

+1

Hai solo bisogno di * importare * B in A. Non devi devi * collegare * B in A. Finché l'app finale collega sia B che A, allora funzionerà tutto. Ecco a cosa servono i linkers. Un framework non deve essere in grado di risolvere tutti i suoi simboli fintanto che può risolverli nel momento in cui viene eseguita l'app. –

+0

Il problema è che se non colleghi la B alla A il progetto quadro non costruire e ottenere errori di simboli indefiniti come spiego in quella domanda: http://stackoverflow.com/questions/34609229/undefined-symbols-issue-with- googlemobileads –

0

Se si utilizzano più framework, è possibile provare il gestore delle dipendenze Cocoa Pods che consente di accedere a più framework. Questo ti consentirà anche di mantenere il punto di interruzione che ti aiuterà a eseguire il debug anche all'interno del framework e inoltre puoi apportare modifiche.

Problemi correlati