Pergunta

Tenho uma classe personalizada que uso com frequência em meus projetos.Esta classe possui vários métodos, mas nem todos são usados ​​em todos os projetos.

Minha pergunta é:incluir esta classe em um projeto irá inchar o projeto com código inútil ou o compilador incluirá apenas os métodos usados?

Quer dizer, se minha classe tiver 30 métodos, mas apenas 4 estiverem sendo usados ​​em um determinado projeto, o compilador incluirá também os outros 26 não utilizados ou apenas os 4 usados ​​no produto final?

Caso inclua tudo, existe uma maneira de forçá-lo a desconsiderar os métodos não utilizados e reduzir o binário ao mínimo?

Foi útil?

Solução

O vinculador suporta despir-se, se você ativá-lo, o código não utilizado não deverá causar nenhum inchaço.

De Documentos da Apple:

O vinculador estático (LD) suporta a remoção de código não utilizado e blocos de dados dos arquivos executáveis.Esse processo (conhecido como remoção de código morto) ajuda a reduzir o tamanho geral dos executáveis, o que, por sua vez, melhora o desempenho, reduzindo a pegada de memória do executável.Ele também permite que os programas vinculem com sucesso quando o código não utilizado refere -se a um símbolo indefinido (em vez de resultar em um erro de link).

A remoção do código morto não se limita à remoção de apenas funções não utilizadas e código executável de um binário.O vinculador também remove quaisquer símbolos e dados não utilizados que residam em blocos de dados.Tais símbolos podem incluir variáveis ​​globais, variáveis ​​estáticas e dados de string, entre outros.

Quando a remoção do código morto é ativado, o vinculador estático procura por código que não é alcançado a partir de um conjunto inicial de símbolos e blocos ao vivo.

Outras dicas

Se os outros 26 métodos tiverem código em @implementation, então sim, eles serão utilizados no produto final.

O motivo é o sistema de tempo de execução.Mesmo que você não tenha usado esses 26 métodos em tempo de compilação, não há garantia de que eles não serão referidos em tempo de execução (lembre-se NSSelectorFromString e -performSelector:).

Não sei se existe uma maneira de forçar a remoção desses códigos.(-dead_strip não funciona.)

Parece que você precisa refatorar e renomear a classe big fat mamma.

Minha pergunta é:Incluir esta classe em um projeto inchará o projeto com código inútil ou o compilador apenas incluirá os métodos utilizados?

Acho que você está falando sobre incluir o cabeçalho e a implementação de sua classe auxiliar.Isso aumentará o tamanho binário.Conforme apontado por jessecurry, o vinculador oferece suporte à remoção de becos sem saída.Isso é ruim, pois sempre existe a possibilidade de alguém querer vincular-se à API pública do seu binário (felizmente, esse não é o caso, pois a vinculação dinâmica não é permitida no iPhone, mas considere outras plataformas).Mas aposto que a diferença de tamanho é marginal demais para ser significativa.

O maior impacto em termos de tamanho geralmente são os recursos que você inclui em sua aplicação (imagens, strings etc.).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top