iOS 5:使NSString类别包括NSCFConstantString?

我有一个NSString类的类( NSString+URLEncoding.h )。 我遇到和未知的select器崩溃,因为我调用的类别方法的string已被iOS优化成一个NSCFConstantString

 -[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174 

我从以下NSCFConstantString NSCFString了iOS 5中的NSCFConstantStringNSCFString优化: http : //www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/

任何人都知道我如何能得到的NSString类别包括常量string,甚至强制NSString/NSCFString是一个NSString/NSCFString而不是一个NSCFConstantString

干杯,Z

-编辑-

  • 链接器标志-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; } 

链接器有一个问题,可能导致其死代码剥离完全忽略任何只包含obj-c类别的对象文件(或者未被引用的对象文件)。 理论上将-ObjC标志传递给链接器应该可以解决这个问题,但这似乎并不总是奏效。 您可以通过提供-all_load链接器标记来解决此问题,这会导致链接器始终链接到所有对象文件中。

请注意,如果您的类别是某个子项目或库的一部分,则可能必须在父项目上设置-all_load

刚花了30分钟搞清楚完全一样的问题。 在链接器摆弄之后,我发现这个类别在我的目标构build阶段的 编译源列表中不存在。 一定要检查它在那里。

__NSCFConstantStringNSString一个子类,所以NSString任何类别也适用于__NSCFConstantString

要么你没有链接你的类别,或者你的类没有在@implementation定义一个URLEncodedString方法。