11

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

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

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

有谁知道我如何让 NSString 类别包含常量字符串,甚至强制 var 成为 anNSString/NSCFString而不是 an 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;
}
4

3 回答 3

12

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

请注意,-all_load如果您的类别是您在某处包含的子项目或库的一部分,您可能必须在父项目上进行设置。

更新:我相信-ObjC现在是可靠的并且已经使用了多年,所以你可以停止使用-all_load这个问题。

于 2012-09-10T20:07:15.397 回答
4

只花了 30 分钟找出完全相同的问题。在摆弄链接器后,我发现该类别不在我的目标的Build Phases的Compile Sources列表中。一定要检查它的存在。

于 2013-04-23T08:49:54.677 回答
2

__NSCFConstantString是 的子类NSString,因此任何类别也NSString适用于__NSCFConstantString

要么你没有在你的类别中链接,要么你的类别没有URLEncodedString在它的@implementation.

于 2012-09-10T20:05:04.253 回答