我遇到NSString componentsSeparatedByString方法的问题。
这是一个例子:
(lldb) p [[@"TEST\\¦TEST\\WORKS" componentsSeparatedByString:@"¦"] objectAtIndex: 0]
(NSTaggedPointerString *) $13 = 0xa00005c545345545 @"TEST\"
(lldb) p [[@"TEST\\¦TEST\\WORKS" componentsSeparatedByString:@"¦"] objectAtIndex: 1]
(__NSCFString *) $14 = 0x000000017023f440 @"TEST\\WORKS"
在我看来,最后有一个逃脱反斜杠的子串失去了正确的反斜杠\\
。
在上面的例子中,我期待在第一种情况下NSString(@"TEST\\"
)而不是我得到一个NSTaggedPointerString(@"TEST\"
),其最后一个字符未正确转义。
我做错了什么或假设该方法应该以不同的方式运作?
我问这个问题,因为我必须在NSPredicate中使用子字符串,我得到以下异常:
NSArray *explodePair = [pair componentsSeparatedByString:@"¦"];
NSString *colorCode = [explodePair count] > 0 ? [explodePair firstObject] : nil;
[self.colors filteredOrderedSetUsingPredicate:[NSPredicate predicateWithFormat:@"code LIKE %@", colorCode]]
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因是:'反斜杠是一个通配符char,并且不能在字符串末尾显示未转义。
这里的问题是NSTaggedPointerString
和__NSCFString
令人困惑地在LLDB输出中以不同方式显示单个反斜杠。
您可以使用po
而不是p
以相同的方式查看它们。
您还可以在NSString上使用length
方法来检查NSTaggedPointerString
显示为\
但__NSCFString
显示为\\
实际上只是一个字符。