iOS 5:使NSString类别包括NSCFConstantString?

Zai*_*ani 11 objective-c ios objective-c-category ios5

我有一个NSString类class(NSString+URLEncoding.h).我遇到了未知的选择器崩溃,因为我调用类别方法的字符串已经被NSCFConstantStringiOS 优化.

-[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174
Run Code Online (Sandbox Code Playgroud)

我学到的NSCFConstantStringNSCFStringiOS 5中的优化来自: http://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/

是否有人知道如何让NSString类别包含Constant字符串甚至强制var成为一个NSString/NSCFString而不是一个NSCFConstantString

干杯,Z

-编辑-

  • 链接器标志-ObjC -all_load已经实现
  • NSString + URLEncoding.m包含在目标编译源中
  • NSString + URLEncoding.m实现了URLEncodedString方法.
  • 检查僵尸.

我正在为ShareKit 2.0添加共享服务

标题:

@interface NSString (OAURLEncodingAdditions)

- (NSString *)URLEncodedString;
Run Code Online (Sandbox Code Playgroud)

执行:

@implementation NSString (OAURLEncodingAdditions)

- (NSString *)URLEncodedString 
{
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                           (CFStringRef)self,
                                                                           NULL,
                                                                           CFSTR("!*'();:@&=+$,/?%#[]"),
                                                                           kCFStringEncodingUTF8);
    [result autorelease];
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Lil*_*ard 12

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

请注意,-all_load如果您的类别是您所包含的子项目或库的一部分,则可能必须设置父项目.

更新:我认为-ObjC现在已经可靠并且已经存在多年,因此您可以停止使用-all_load此问题.