2012-01-31 11 views
10

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.

enter image description here

risposta

9

Date un'occhiata a questo technical Q&A che spiega il -ObjC e opzioni -all_load che @Ell Neal menziona .

Nota Le opzioni del linker devono essere impostati sul progetto che è il collegamento del quadro (vale a dire il cliente del quadro) non il framework stesso. Dal tuo screenshot sembra che tu stia impostando l'opzione nel tuo progetto quadro perché posso vedere il file sorgente NString+Extensions.m sulla sinistra.

+0

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

+0

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

3

è necessario aggiungere -ObjC a Altre Bandiere Linker nelle impostazioni di generazione. Se questo non funziona, prova ad aggiungere -all_load

+0

Grazie per la tua risposta rapida. l'ho già fatto: stesso problema. – Niko

+1

Penso che questa risposta sia corretta, sei sicuro di aver aggiunto entrambi questi flag al tuo target attivo? A volte li ho aggiunti al mio progetto e ho dimenticato di ereditarli nel target, e questo è il motivo per cui non ho visto le mie categorie. – lawicko

+0

@lawicko: sì, ho aggiunto queste opzioni al mio obiettivo, per favore dai un'occhiata al mio post modificato. – Niko

1

Suona come è necessario #import "NSString+Extensions.h" nella vostra AppDelegate.m

+1

Non farlo causerebbe solo un avviso di build, non un crash. –

+0

In AppDelegate.m, ho aggiunto #import . CUtils è il mio nome di framework, CUtils.h contiene #import di tutti i file di intestazione contenuti nel mio framework (NSString + Extensions.h incluso) – Niko

+0

Credo che avrete bisogno di tutti i file h –