【发布时间】:2014-06-18 00:18:24
【问题描述】:
我有一个 NSRange 对象的 NSDictionary,它们在数组中的索引键。我正在尝试使用这些范围中的每一个来创建更大字符串的子字符串,并将这些子字符串中的每一个放入数组中。我基本上已经完成了,但是 NSRange 神秘地改变了它在代码中的值,导致它崩溃并抛出异常。这是我的代码:
NSMutableArray*subStringArray = [[NSMutableArray alloc] init];
for(id key in aDict){
NSRange* range = CFBridgingRetain([aDict objectForKey:key]);
NSLog(@"This is a single range: %@",range);
//Range is changed here somehow
NSString* aSubString = [self.content substringWithRange:*range];
NSLog(@"%@",aSubString);
[subStringArray addObject:aSubString];
}
我的日志输出如下所示:
This is a single range: NSRange: {1874, 72}
2014-06-17 20:07:30.100 testApp[8027:60b] *** Terminating app due to uncaught exception
'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {4318599072, 4} out of bounds; string length 5562'
【问题讨论】:
-
几个问题: 1) 不能直接将
NSRange存储在字典(或其他集合)中。 2)NSRange是struct,而不是类。不要将它与指针一起使用。 3) 不要将CFBridgingRetain与struct一起使用。将NSRange包裹在NSValue中以将其与集合一起使用。 -
@maddy,您应该充实您的评论并将其作为答案提交。您已经触及了 OP 代码的大部分问题,因此您应该得到“已接受的答案”代表点。
-
我同意 100%。谢谢rmaddy。如果您将此作为答案提交,我会很乐意选中该框:)
标签: ios objective-c nsrange nsexception nsrangeexception