Pregunta

Me estoy extendiendo una clase de una biblioteca externa. Aquí está mi código:

Archivo de cabecera: Gestor + MyCategory.h

#import "Manager.h"
#import "Element.h"

@interface Manager (myCategory) 
- (Element*) elementWithTag:(NSInteger)tag; 
@end

archivo de implementación: Gestor de archivos + MyCategory.h

@implementation Manager (myCategory) 

- (Element*) elementWithTag:(NSInteger)tag {
    ...
}

@end

Ahora aquí es cómo utilizo esta categoría:

#import "Manager+MyCategory.h"

@implementation myClass 

- (void) myFunction:(NSInteger)tag {
   Manager* myManager = [[Manager alloc] init];
   Element* = [myManager elementWithTag:tag];

   ...

   [myManager release];
}

@end

Cuando compilo tengo ninguna advertencia, pero cuando ejecuto mi programa me sale el siguiente error:

*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]:

Archivo de cabecera (es decir del encargado un MyCategory.h) se importa correctamente, pero parece que el vínculo con el archivo de implementación no se hace. Si sustituyo import "Administrador + MyCategory **. ** h" por import "Administrador + MyCategory **. ** m" en mi clase que funciona correctamente.

Alguien me puede explicar lo que se me olvidó? Gracias

¿Fue útil?

Solución

Las categorías no funcionan bien con Unix tradicionales estáticos bibliotecas.

Si ese es su caso, parece que la aprobación de la opción -ObjC al enlazador resuelve el problema.

de Apple Técnica Q y A QA1490 explica todo.

Otros consejos

Sospecho que usted ha olvidado de añadir el Administrador + MyCategory.m al objetivo approrpriate en Xcode. Usted no recibe un error de enlazador porque existen todos los símbolos y no hay ninguna advertencia del compilador debe a que incluyó los archivos de cabecera apropiados, pero en tiempo de ejecución de la aplicación del método elementWithTag: que falta.

Disculpas, no podía añadir esto como un comentario ...

Sólo para la prueba, es posible que desee agregar una función c extern declarada en la cabecera y puesto en práctica en el archivo .m. Si se llama a esta función c dentro de su código de prueba, entonces este generar un error de vinculador debido a un identificador sin resolver.

Esto puede hacer que sea más fácil para investigar el problema, ya que proporciona información inmediata y puede generar algunas pistas adicionales en cuanto a por qué no se está incluyendo el archivo.

Teniendo en cuenta el marco de tiempo, voy a suponer que haya hecho esto, pero por si acaso ... asegúrese de que haya limpiado el objetivo, apague XCode, y luego vuelva a abrir. He tenido los archivos de proyecto corrompido en la memoria y actuar de forma extraña.

Barney

I tenía este problema cuando se actualiza a Xcode 4.

Para solucionar tuve que separar mi definición de categoría en un .m independiente y un .h - Xcode 3 parecía estar bien con la implementación y la interfaz de estar en un .h ... pero oh no Xcode 4 es bastante exigente anal <. / p>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top