Cosa fa il flag del linker -all_load?


123

Non riesco a trovare da nessuna parte cosa fa il flag -all_load durante la compilazione del codice Objective-C.

Ho alcuni problemi a caricare i binari su Apple, dicono che è perché non ho usato questo flag, ma il mio codice si compila anche senza di esso.

Qualcuno mi può aiutare con questo?

Grazie


2
In genere, qualsiasi errore visualizzato con questo si verifica sul dispositivo durante l'esecuzione dell'applicazione. Stai dicendo che non hai testato la tua applicazione sull'hardware reale prima dell'invio per la revisione da parte di Apple? Se è così, è un'idea molto, molto cattiva.
Brad Larson

L'ho testato, tuttavia la mia configurazione di "distribuzione" - quella con il profilo di provisioning dell'app store - non aveva il flag e tutti i test sono stati eseguiti utilizzando il profilo di sviluppo che aveva il flag, quindi tutto sembra a posto, e quando L'ho compilato per l'app store con il profilo di distribuzione il flag era disattivato e poiché il profilo di distribuzione non può essere installato localmente non ho potuto controllarlo.
Guy Ephraim

Risposte:


144

Probabilmente è correlato a questa nota tecnica https://developer.apple.com/library/content/qa/qa1490/_index.html

IMPORTANTE: per le applicazioni a 64 bit e iPhone OS, esiste un bug del linker che impedisce a -ObjC di caricare file di oggetti da librerie statiche che contengono solo categorie e nessuna classe. La soluzione alternativa è utilizzare i flag -all_load o -force_load. -all_load forza il linker a caricare tutti i file oggetto da ogni archivio che vede, anche quelli senza codice Objective-C. -force_load è disponibile in Xcode 3.2 e versioni successive. Consente un controllo più preciso del caricamento degli archivi. Ogni opzione -force_load deve essere seguita da un percorso a un archivio e ogni file oggetto in quell'archivio verrà caricato.


3
Sì, questo entra in gioco principalmente con le librerie statiche per iPhone. Se vengono compilati senza questo flag del linker, le categorie non sono incluse nel file binario creato e qualsiasi applicazione che utilizza queste librerie statiche avrà errori di runtime se eseguita sull'hardware del sistema operativo iPhone.
Brad Larson

1
non dovrebbero esserci alcuni avvertimenti o errori del metodo mancante in fase di compilazione?
Guy Ephraim

18
No, perché le categorie esistono in fase di compilazione, semplicemente non vengono collegate nel binario finale. Ma a causa della natura dinamica dei dispacci Obj-C, il linker non punta il codice di chiamata direttamente al metodo di implementazione, quindi non si accorge mai che manca. Quindi in fase di esecuzione, ottieni il kaboom, come se lo avessi chiamato usando "-performSelector:"
Sophistifunk

14
Voglio solo chiarire la nota tecnica: la maggior parte delle volte vorrai il flag del linker -ObjC, non -all_load. -all_load è consigliato nell'istanza (presumo raro) in cui hai una libreria senza classi, solo categorie.
Chris Hill

3
Secondo stackoverflow.com/a/2615407/62 questo è stato risolto a partire da XCode 4.2, quindi non hai più bisogno dei flag -all_load o -force_load. Hai ancora bisogno di -ObjC.
Liron Yahdav
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.