2012-01-31 12 views
10

Opracowałem własny framework, który zawiera użyteczne klasy/metody, z których często korzystam w moich aplikacjach. Niedawno dodałem rozszerzenie klasy dla NSString "NSString + Extensions.h/m", aby dodać własne metody. Przykład:Rozszerzenia klasy i frameworki

  • 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 

Pomyślnie skompilowałem mój framework. Ale gdy próbuję użyć jednej z funkcji tego rozszerzenia klasy w dowolnej aplikacji:

  • 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]); 
    } 

...

otrzymuję następujący błąd:

2012-01-31 17: 01: 09.921 TestCUtils [4782: 207] Je suis une chaîne avec des caracteres spéciaux 2012-01-31 17: 01: 09.924 TestCUtils [4782: 207] - [__ NSCFConstantString removeDiacritics]: nierozpoznany selektor wysyłane

Ale jeśli dodam moje rozszerzenie klasy bezpośrednio do instancji 0x340c w aplikacji (poza moją strukturą) działa dobrze ...

Dowolna podpowiedź?

** EDIT **

Jak niektórzy z Was pytało, Dodałem -all_load i -ObjC opcji 'Inne Flagi Linker', ale problem pozostaje.

enter image description here

Odpowiedz

9

Spójrz na tego technical Q&A że wyjaśnia -ObjC i opcje -all_load że @Ell Neal wspomina .

Uwaga Opcje łączące muszą być ustawione na projekt, który jest łączącej ramy (czyli klienta ram) nie sama ramy. Na zrzucie ekranu wygląda na to, że ustawiasz opcję w projekcie ramowym, ponieważ po lewej stronie widzę plik źródłowy NString+Extensions.m.

+0

Awesome! to działa. Dodałem tylko flagę -ObjC linker w moim celu aplikacji i to działa. Mam jednak pytanie. W mojej strukturze utworzyłem klasę do zarządzania bazą danych SQLite, więc potrzebuję ti link do libsqlite3.dylib. Kiedy dodam moje środowisko do mojej aplikacji z tą nową flagą linkera, mam błędy kompilacji z tego powodu, że nie łączę biblioteki libsqlite3.dylib, nawet jeśli już ją połączyłem w ramach mojej struktury (nie wiem czy jestem czysty dość). Może brakuje mi czegoś ... – Niko

+0

To prawdopodobnie kwalifikuje się jako osobne pytanie. Ogólnie rzecz biorąc, będziesz musiał jawnie połączyć zależne biblioteki w swojej aplikacji. Byłoby miło, gdyby połączenie z niestandardowym frameworkiem przyciągnęło również biblioteki zależne, ale nie sądzę, że jest na to jakiś sposób. –

3

Trzeba dodać -ObjC do inne flagi Linker w ustawieniach kompilacji. Jeśli to nie zadziała, spróbuj dodać -all_load

+0

Dziękujemy za szybką odpowiedź. już to zrobiłem: ten sam problem. – Niko

+1

Myślę, że ta odpowiedź jest poprawna, czy na pewno dodasz obie te flagi do aktywnego celu? Czasami dodawałem je do mojego projektu i zapomniałem je odziedziczyć w celu, dlatego nie widziałem swoich kategorii. – lawicko

+0

@lawicko: Tak, dodałem te opcje do mojego celu, proszę spojrzeć na mój zredagowany post. – Niko

1

Brzmi jak trzeba #import "NSString+Extensions.h" w AppDelegate.m

+1

Nie wykonanie tego spowoduje tylko ostrzeżenie o kompilacji, a nie awarię. –

+0

W AppDelegate.m dodałem #import . CUtils to moja nazwa, CUtils.h zawiera #import wszystkich plików nagłówkowych zawartych w moim frameworku (NSString + Extensions.h włączone) – Niko

+0

Wierzę, że będziesz potrzebować wszystkich plików h –

Powiązane problemy