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

Foi útil?

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>

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