Ho sviluppato il mio framework che contiene classi/metodi utili che uso spesso nelle mie app. Recentemente, ho aggiunto un'estensione di classe per NSString "NSString + Extensions.h/m" per aggiungere i miei metodi. Esempio:Estensioni e quadri di classe
- 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
Compilare correttamente il mio framework. Ma quando cerco di utilizzare una delle funzioni di questa estensione di classe in qualsiasi applicazione:
- 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]); }
...
ho la errore seguente:
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]: selettore non riconosciuto inviato ad esempio 0x340c
Ma se aggiungo la mia estensione gran classe nell'applicazione (al di fuori del mio framework), funziona bene ...
Qualche suggerimento?
** EDIT **
Come alcuni di voi hanno chiesto, ho -all_load e opzioni -ObjC in 'Altre Bandiere Linker', ha aggiunto, ma il problema rimane.
Impressionante! Funziona. Ho aggiunto solo il flag link -ObjC nella destinazione dell'applicazione e questo funziona. Ho una domanda però. Nel mio framework, ho creato una classe per gestire il database SQLite, quindi ho bisogno di collegarmi a libsqlite3.dylib. Quando aggiungo il mio framework nella mia applicazione con questo nuovo flag linker, ho errori di compilazione dovuti al fatto che non leggo libsqlite3.dylib, anche se l'ho già collegato all'interno del mio framework (non so se sono chiaro abbastanza). Forse mi manca qualcosa ... – Niko
Questo probabilmente si qualifica come una domanda separata. In generale, è necessario collegare esplicitamente le librerie dipendenti nella propria applicazione. Sarebbe bello se il collegamento di un framework personalizzato portasse anche le librerie dipendenti, ma non penso che ci sia un modo per farlo. –