NSRange 在 for 循环中改变自身

Posted

技术标签:

【中文标题】NSRange 在 for 循环中改变自身【英文标题】:NSRange changes itself inside for loop 【发布时间】: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) NSRangestruct,而不是类。不要将它与指针一起使用。 3) 不要将CFBridgingRetainstruct 一起使用。将 NSRange 包裹在 NSValue 中以将其与集合一起使用。 @maddy,您应该充实您的评论并将其作为答案提交。您已经触及了 OP 代码的大部分问题,因此您应该得到“已接受的答案”代表点。 我同意 100%。谢谢rmaddy。如果您将此作为答案提交,我会很乐意选中该框:) 【参考方案1】:

根据大众需求:)

您的代码的主要问题是您将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];

【讨论】:

以上是关于NSRange 在 for 循环中改变自身的主要内容,如果未能解决你的问题,请参考以下文章

NSOutlineView 子类崩溃 - NSRangeException

js中for循环使用方法详解

ResultSet遍历过程中修改自身数据,不会改变循环的过程

FOR循环中的上界在循环中没有改变,为啥?

v-for循环出来的元素,实现鼠标放在当前元素,改变样式

求大神啊!matlab可以在循环体中改变循环变量来改变循环次数吗?如何进行呢?