IOS 5: Сделать категорию NSString включают NSCFConstantString?
У меня есть класс категории NSString
(NSString+URLEncoding.h
).
Я столкнулся с ошибкой и неизвестным селектором, потому что строка, которую я вызываю методом категории, была оптимизирована в NSCFConstantString
iOS.
-[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174
Я узнал об оптимизации NSCFConstantString
vs. NSCFString
в iOS 5:
http://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/
Кто-нибудь знает, как я могу получить категорию NSString для включения строк Constant или даже заставить var быть NSString/NSCFString
, а не NSCFConstantString
?
Cheers,
Z
-edit -
- Флаги компоновщика
-ObjC -all_load
уже реализованы
- NSString + URLEncoding.m включен в источники компиляции целей.
- NSString + URLEncoding.m реализует метод URLEncodedString.
- Проверено для зомби.
Я добавляю службу общего доступа к ShareKit 2.0
Заголовок:
@interface NSString (OAURLEncodingAdditions)
- (NSString *)URLEncodedString;
реализация:
@implementation NSString (OAURLEncodingAdditions)
- (NSString *)URLEncodedString
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)self,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8);
[result autorelease];
return result;
}
Ответы
Ответ 1
Возникает проблема с компоновщиком, который может привести к тому, что его заглушка мертвого кода полностью опустит любые объектные файлы, которые содержат только категории obj-c (или которые иначе не указаны). Теоретически передача флага -ObjC
в компоновщик должна исправить это, но это, похоже, не всегда работает. Вы можете обойти эту проблему, указав флаг -all_load
linker, который заставит компоновщик всегда ссылаться во всех объектных файлах.
Обратите внимание, что вам может потребоваться установить -all_load
в родительском проекте, если ваша категория является частью подпроекта или библиотеки, которую вы где-то включаете.
Ответ 2
Просто потратил 30 минут на то, чтобы выяснить ту же проблему. После возиться с компоновщиком я узнал, что эта категория отсутствует в списке "Источники компиляции" в моей целевой фазе сборки. Обязательно проверьте его там.
Ответ 3
__NSCFConstantString
является подклассом NSString
, поэтому любые категории в NSString
также относятся к __NSCFConstantString
.
Либо вы не связываетесь в своей категории, либо ваша категория не определяет метод URLEncodedString
в своем @implementation
.