2014-06-18 37 views
0

我有一个NSRange对象的NSDictionary,它们的索引在数组中。我正在尝试使用这些范围中的每一个来创建较大字符串的子字符串,并将这些子字符串中的每一个放在数组中。我基本上已经完成了,但NSRange神秘地改变了它在代码中的价值,导致它崩溃并抛出异常。这里是我的代码: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

几个问题:1)你不能直接存储的'NSRange'在字典(或其他收藏)。 2)'NSRange'是一个'struct',而不是一个类。不要用指针。 3)不要在'struct'中使用'CFBridgingRetain'。将'NSRange'包装在一个'NSValue'中以将其用于集合。 – rmaddy

+0

@maddy,你应该充实你的评论并提交它作为答案。你已经触及了OP代码中大部分错误的事情,所以你应该得到“接受的答案”的代表点。 –

+0

我同意100%。谢谢rmaddy。如果您将此作为答案提交,我会很乐意检查该框。 – RDSpinz

回答

3

应广大用户要求:)

与您的代码的主要问题是,你是直接存储的NSRange结构在你的字典中。你不能这样做。您必须将NSRange包装在NSValue中以将其存储在字典中。

要添加NSRange你可以这样做:

NSRange range = ... // some range 
NSValue *value = [NSValue valueWithRange:range]; 
dict[someKey] = value; 

然后您发布的代码就变成了:

for (id key in aDict) { 
    NSValue *value = aDict[key]; 
    NSRange range = [value rangeValue]; 
    NSLog(@"This is a single range: %@",range); 
    //Range is changed here somehow 
    NSString* aSubString = [self.content substringWithRange:range]; 
    NSLog(@"%@",aSubString); 
    [subStringArray addObject:aSubString]; 
}