Расширения и рамки классов
У меня есть собственная структура, содержащая полезные классы/методы, которые я часто использую в своих приложениях. Недавно я добавил расширение класса для NSString "NSString + Extensions.h/m", чтобы добавить свои собственные методы. Пример:
@interface NSString (Extensions)
- (NSString *)removeDiacritics;
@end
#import "NSString+Extensions.h"
@implementation NSString (Extensions)
- (NSString *)removeDiacritics
{
return [[[NSString alloc] initWithData:[self dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
}
@end
Я успешно скомпилирую свою фреймворк. Но когда я пытаюсь использовать одну из функций этого расширения класса в любом приложении:
// 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]);
}
...
Я получаю следующую ошибку:
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]: непризнанный селектор, отправленный в экземпляр 0x340c
Но если я добавлю расширение своего класса непосредственно в приложение (вне моей рамки), он отлично работает...
Любые подсказки?
** РЕДАКТИРОВАТЬ **
Как некоторые из вас спросили, я добавил опции -all_load и -ObjC в "Other Linker Flags", но проблема остается.
![enter image description here]()
Ответы
Ответ 1
Посмотрите на этот технический Q & A, который объясняет опции -ObjC и -all_load, которые упоминает @Ell Neal.
Примечание Параметры компоновщика должны быть установлены в проекте, который связывает фреймворк (т.е. клиент фреймворка) не сам фрейм. На скриншоте похоже, что вы устанавливаете параметр в своем проекте framework, потому что я вижу исходный файл NString+Extensions.m
слева.
Ответ 2
Вам нужно добавить -ObjC
к другим флагам компоновщика в настройках сборки. Если это не сработает, попробуйте добавить -all_load
Ответ 3
Похоже, вам нужно #import "NSString+Extensions.h"
в AppDelegate.m