Objective-C importação Categoria comportamento estranho
-
11-09-2019 - |
Pergunta
Eu estou estendendo uma classe a partir de uma biblioteca externa. Aqui está o meu código:
Arquivo de Cabeçalho: Gerente + MyCategory.h
#import "Manager.h"
#import "Element.h"
@interface Manager (myCategory)
- (Element*) elementWithTag:(NSInteger)tag;
@end
arquivo de implementação: arquivo Gestor + MyCategory.h
@implementation Manager (myCategory)
- (Element*) elementWithTag:(NSInteger)tag {
...
}
@end
Agora, aqui está como eu uso nesta categoria:
#import "Manager+MyCategory.h"
@implementation myClass
- (void) myFunction:(NSInteger)tag {
Manager* myManager = [[Manager alloc] init];
Element* = [myManager elementWithTag:tag];
...
[myManager release];
}
@end
Quando eu compilar eu tenho nenhum aviso, mas quando eu executar o meu programa eu recebo o seguinte erro:
*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]:
Arquivo de cabeçalho (ou seja, Gerente + MyCategory.h) está correctamente importado, mas parece que o link com o arquivo de implementação não é feito. Se eu substituir #import "Gestor + MyCategory **. ** h" por #import "Gestor + MyCategory **. ** m" na minha classe que está funcionando corretamente.
Alguém pode me explicar o que eu esqueci? Graças
Solução
Categorias não funcionam bem com o tradicional Unix estática bibliotecas.
Se for esse o seu caso, parece que passando a opção -ObjC para o vinculador resolve o problema.
a Apple Técnico Q & A QA1490 explica tudo.
Outras dicas
Eu suspeito que você esqueceu de adicionar o Gestor + MyCategory.m ao alvo approrpriate no Xcode. Você não obter um erro de vinculador porque existem todos os símbolos e não há aviso do compilador porque você incluiu os arquivos de cabeçalho, mas em tempo de execução da implementação do método elementWithTag:
está faltando.
Desculpas, não poderia acrescentar isso como um comentário ...
Apenas para testar, você pode querer adicionar uma função c externa declarada no cabeçalho e implementada no arquivo .m. Se você chamar essa função c dentro de seu código de teste então este gerar um erro de vinculador devido a um identificador não resolvido.
Isto pode tornar mais fácil para investigar o problema, uma vez que fornece um feedback imediato e pode gerar algumas pistas adicionais a respeito de porque o arquivo não está sendo incluída.
Dado o período de tempo, eu vou assumir que você fez isso, mas apenas no caso ... se certificar de que você limpou o alvo, desligue XCode, e então re-aberto. Eu tive os arquivos de projeto corrompido na memória e agir estranhamente.
Barney
Eu tive esse problema quando a atualização para o Xcode 4.
Para corrigir eu tinha que separar a minha definição de categoria em um .m separada e uma .h - Xcode 3 parecia bem com a implementação e interface de estar em um .h ... mas oh não exigente Xcode 4 é bastante anal <. / p>