【问题标题】:Why does formatting a NSPredicate while encoding URL cause a crash in swift?为什么在编码 URL 时格式化 NSPredicate 会导致 swift 崩溃?
【发布时间】:2015-09-07 05:56:56
【问题描述】:

最近,我尝试在 swift 项目中使用 NSpredicate 进行电话号码验证,但它总是崩溃。 代码是这样的:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    var regexPhoneNum = NSPredicate(format: "SELF MATCHES %@", "^1[0-9]{10}$")
    println(regexPhoneNum)
    return true
}

它崩溃了

var regexPhoneNum = NSPredicate(format: "SELF MATCHES %@", "^1[0-9]{10}$")

崩溃信息:

2015-09-08 09:51:17.044 PredicateTest[4319:79934]-[__NSCFString count]:无法识别的选择器发送到实例 0x7c153110

我发现这个崩溃是由使用 Objective-C 的 NSString 类别引起的,代码如下:

.h

@interface NSString (HttpManager)
- (NSString *)encode;
@end

.m

@implementation NSString (HttpManager)
- (NSString *)encode
{
NSString *outputString  = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8
));
outputString = [outputString stringByReplacingOccurrencesOfString:@"<null>" withString:@""];
return outputString;
}
@end

谁能解决这个问题或者给我一些建议,谢谢!

【问题讨论】:

  • 在我的情况下,它没有在 xcode 7 beta 5 上进行崩溃测试
  • 我也无法重现 Xcode 6.4 的问题。那是你的确切代码吗? – 错误消息表明您在需要 NSArray 的地方有一个 NSString。
  • 好吧,我创建一个新项目并将代码行粘贴到'application didFinishLaunching'函数中也可以正常运行。这是我的确切代码,谢谢
  • 抱歉,我发现是 NSString 类别导致的崩溃,但是为什么?

标签: ios objective-c c swift nspredicate


【解决方案1】:

明白了!可能 NSPredicate 格式化字符串默认使用编码方法!类别的编码与系统的编码冲突... omg,朋友们要小心这种情况。我只是通过添加前缀来更改方法名称并解决问题!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多