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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.