iOS 5:使NSString类别包括NSCFConstantString?
我有一个NSString
类的类( NSString+URLEncoding.h
)。 我遇到和未知的select器崩溃,因为我调用的类别方法的string已被iOS优化成一个NSCFConstantString
。
-[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174
我从以下NSCFConstantString
NSCFString
了iOS 5中的NSCFConstantString
和NSCFString
优化: 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阶段的 编译源列表中不存在。 一定要检查它在那里。
__NSCFConstantString
是NSString
一个子类,所以NSString
任何类别也适用于__NSCFConstantString
。
要么你没有链接你的类别,或者你的类没有在@implementation
定义一个URLEncodedString
方法。