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.
¡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
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. –