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.