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