Objective c ObjC/NSRange:范围或索引超出范围

Objective c ObjC/NSRange:范围或索引超出范围,objective-c,nsrange,Objective C,Nsrange,我正试图找到一个问题的答案,这个问题从昨晚起就一直困扰着我 NSRange searchRange.location = 0; NSRange searchRange.length = [string length]; // > 2000 characters long NSString *substring = @"substring"; // Occurs within string several times NSRange substringRange = [string ran

我正试图找到一个问题的答案,这个问题从昨晚起就一直困扰着我

NSRange searchRange.location = 0;
NSRange searchRange.length = [string length]; // > 2000 characters long
NSString *substring = @"substring"; // Occurs within string several times

NSRange substringRange = [string rangeOfString:substring options:NSCaseInsensitiveSearch range:searchRange];

// Some code here. Create substring and add it to array.

// Move the search range on
searchRange.location = substringRange.location + substringRange.length;

// fails
substringRange = [string rangeOfString:substring options:NSCaseInsensitiveSearch range:searchRange];
第一个[string rangeOfString…]方法可以顺利调用,但第二个调用会导致以下错误:

*-[\u NSCFString rangeOfString:选项:范围:区域设置:]:范围或索引超出范围

据我所知,这个问题是由于将新值赋值给searchRange.location引起的——删除该语句会导致对该方法的第二次调用成功。看着调试器,这些值似乎和预期的一样——没有超出范围——我对着监视器尖叫


这只是简单的加法。。。不是吗?

问题是您修改了位置,但没有修改长度。结果是范围太长。解决方法是在增加位置的同时减少长度。

问题在于修改位置但不修改长度。结果是范围太长。解决方案是在增加位置的同时减少长度。

您可能不想声明两次
NSRange searchRange
。我不知道您想做什么。@Radu在结构上执行算术?我想我们需要知道您实际上想做什么,dud。问题是它在最后字符串,您将从字符串中不存在的范围执行rangeOfstring,因此如果您告诉我们您要执行的操作,请查看高级视图,我们可能会帮助您可能不想声明两次
NSRange searchRange
。我不知道您想做什么。@Radu正在对结构执行算术?我想我们需要知道您实际要做什么,dud。问题是它在字符串的末尾,您正在从一个在您的字符串中不存在,因此如果您告诉我们您想要做什么,高级视图,我们可能会提供帮助我猜您在计算后是“1”了?这是有效的:searchRange.length=[string length]-searchRange.location;我猜您在计算后是“1”了?这是有效的:searchRange.length=[string length]-searchRange.location;