2012-01-31 9 views
10

He desarrollado mi propio marco que contiene clases/métodos útiles que a menudo uso en mis aplicaciones. Recientemente, agregué una extensión de clase para NSString "NSString + Extensions.h/m" para agregar mis propios métodos. Ejemplo:Extensiones de clase y marcos

  • NSString + Extensions.h
@interface NSString (Extensions) 
- (NSString *)removeDiacritics; 
@end 
  • NSString + Extensions.m
#import "NSString+Extensions.h" 

@implementation NSString (Extensions) 

- (NSString *)removeDiacritics 
{ 
    return [[[NSString alloc] initWithData:[self dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease]; 
} 

@end 

Compilo con éxito mi marco. Pero cuando trato de usar una de las funciones de esta extensión de clase en cualquier aplicación:

  • AppDelegate.m
// CUtils is the name of the framework. CUtils.h contains #import of all header files 
// contained in my framework 
#import <CUtils/CUtils.h> 


    @implementation AppDelegate 

    ... 

    - (void)applicationDidBecomeActive:(UIApplication *)application 
    { 
     /* 
     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previouslyin the background, optionally refresh the user interface. 
     */ 

     NSString *toto = @"Je suis une chaîne avec des caractères spéciaux"; 
     NSLog(@"%@", toto); 
     NSLog(@"%@", [toto removeDiacritics]); 
    } 

...

consigo el siguiente error:

2012-01-31 17: 01: 09.921 TestCUtils [4782: 207] Je suis une chaîne avec des caractères spéciaux 2012-01-31 17: 01: 09.924 TestCUtils [4782: 207] - [__ NSCFConstantString removeDiacritics]: Selector no reconocido enviado a la instancia 0x340c

Pero si añado mi extensión de clase directamente en la aplicación (fuera de mi marco), funciona bien ...

¿Alguna pista?

** ** EDITAR

Como algunos de ustedes han preguntado, he añadido -all_load y opciones -ObjC en 'Otras banderas Linker', pero el problema sigue.

enter image description here

Respuesta

9

Tome un vistazo a este technical Q&A que explica las opciones -all_load -ObjC y que @Ell Neal menciona .

Nota Las opciones del vinculador es necesario establecer en el proyecto que se está ligando el marco (es decir, el cliente del marco) no el propio marco. Desde su captura de pantalla parece que está configurando la opción en su proyecto de marco porque puedo ver el archivo fuente NString+Extensions.m a la izquierda.

+0

¡Impresionante! funciona. He agregado solo el indicador del enlazador -ObjC en mi destino de aplicación y esto está funcionando. Tengo una pregunta sin embargo. En mi marco, he creado una clase para administrar la base de datos SQLite, así que necesito ti para vincular el libsqlite3.dylib. Cuando agrego mi framework en mi aplicación con este nuevo indicador de enlazador, tengo errores de compilación debido a que no enlazo el libsqlite3.dylib, incluso si ya lo vinculé dentro de mi framework (no sé si estoy claro) suficiente). Tal vez me falta algo ... – Niko

+0

Esto probablemente califica como una pregunta separada. En general, deberá vincular explícitamente las bibliotecas dependientes en su aplicación. Sería bueno si vincular un marco personalizado también atrajera las bibliotecas dependientes, pero no creo que haya una manera de hacerlo. –

3

es necesario agregar -ObjC a Otras banderas Linker en los valores de creación. Si esto no funciona, trate de añadir -all_load

+0

Gracias por su respuesta rápida. Ya lo hice: el mismo problema. – Niko

+1

Creo que esta respuesta es correcta, ¿está seguro de que agrega estas dos banderas a su objetivo activo? A veces los añadí a mi proyecto y olvidé heredarlos en el objetivo, y esta era la razón por la que no veía mis categorías. – lawicko

+0

@lawicko: sí, agregué esas opciones a mi objetivo, eche un vistazo a mi publicación editada. – Niko

1

Suena como que necesita #import "NSString+Extensions.h" en su AppDelegate.m

+1

No hacer esto solo causaría una advertencia de compilación, no un bloqueo. –

+0

En AppDelegate.m, he agregado #import . CUtils es mi nombre de framework, CUtils.h contiene #import de todos los archivos de encabezado contenidos en mi framework (NSString + Extensions.h incluido) – Niko

+0

Creo que necesitarás todos los archivos h –

Cuestiones relacionadas