O que o sinalizador -all_load vinculador faz?

123

Não consigo encontrar em nenhum lugar o que o sinalizador -all_load faz ao compilar o código Objective-C.

Tenho alguns problemas ao fazer o upload de binários para a Apple, eles dizem que é porque eu não usei esse sinalizador, mas meu código é compilado mesmo sem ele.

Alguém pode me ajudar com isso?

obrigado

Guy Ephraim
fonte
2
Normalmente, quaisquer erros que você vê com isso ocorrem no dispositivo ao executar o aplicativo. Você está dizendo que não testou seu aplicativo em hardware real antes do envio para revisão pela Apple? Nesse caso, é uma ideia muito, muito ruim.
Brad Larson
Eu testei, no entanto, minha configuração de "distribuição" - aquela com o perfil de provisionamento da loja de aplicativos - não tinha o sinalizador e todos os testes foram feitos usando o perfil de desenvolvimento que tinha o sinalizador, para que tudo pareça bem e quando Compilei-o para a loja de aplicativos com o perfil de distribuição em que o sinalizador estava desligado e, como o perfil de distribuição não pode ser instalado localmente, não pude verificar.
Guy Ephraim

Respostas:

144

Provavelmente está relacionado a esta nota técnica https://developer.apple.com/library/content/qa/qa1490/_index.html

IMPORTANTE: Para aplicativos de SO de 64 bits e iPhone, existe um bug no vinculador que impede o -ObjC de carregar arquivos de objetos de bibliotecas estáticas que contêm apenas categorias e sem classes. A solução alternativa é usar os sinalizadores -all_load ou -force_load. -all_load força o vinculador a carregar todos os arquivos de objetos de todos os arquivos que ele vê, mesmo aqueles sem o código Objective-C. -force_load está disponível no Xcode 3.2 e posterior. Permite um controle mais fino da carga do arquivo morto. Cada opção -force_load deve ser seguida por um caminho para um arquivo morto, e todos os arquivos de objeto nesse arquivo morto serão carregados.

Sharjeel Aziz
fonte
3
Sim, isso entra em jogo principalmente com bibliotecas estáticas para o iPhone. Se eles forem compilados sem esse sinalizador de vinculador, as categorias não serão incluídas no binário incorporado e qualquer aplicativo que utilize essas bibliotecas estáticas terá erros de tempo de execução quando executados no hardware do iPhone OS.
Brad Larson
1
não deve haver alguns avisos ou erros do método ausente no momento da compilação?
Guy Ephraim
18
Não, como as categorias existem no tempo de compilação, elas simplesmente não estão sendo vinculadas ao binário final. Mas, devido à natureza dinâmica dos despachos de Obj-C, o vinculador não aponta o código de chamada diretamente para o método de implementação, portanto, nunca nota que está faltando. Então, no tempo de execução, você obtém o kaboom, como se o tivesse chamado usando "-performSelector:"
Sophistifunk
14
Só quero esclarecer a observação técnica: Na maioria das vezes, você desejará o sinalizador -ObjC vinculador, não -all_load. -all_load é recomendado na instância (eu assumiria rara) em que você tem uma biblioteca sem classes, apenas categorias.
22711 Chris Hill
3
De acordo com stackoverflow.com/a/2615407/62, isso foi corrigido no XCode 4.2, portanto, você não precisa mais dos sinalizadores -all_load ou -force_load. Você ainda precisa de -ObjC.
Liron Yahdav