我正在尝试使用substringWithRange获取NSString的子字符串:NSMakeRange。我从保存的字典中获取初始字符串,保存的字符串写为agent_AGENTNAME,我试图剥离agent_部分。如果我硬编码NSMakeRange中的数字,下面的代码工作正常(如果它是粗糙的话,可以随意批评它) - 就像这样
NSString* savedAgentName = [NSString stringWithFormat:@"%@", [thisfile substringWithRange:NSMakeRange(6,19)]];
但是因为每个人显然都会有不同长度的名字,所以我需要让它更有活力。当我将代码切换到此时:
NSString* savedAgentName = [NSString stringWithFormat:@"%@", [thisfile substringWithRange:NSMakeRange(6,[thisfile length])]];
它崩溃了我的应用。为什么?
这是更大的代码块:
//get saved agents
savedAgents = [[NSMutableArray alloc] initWithObjects:@"Select An Agent", nil];
for(int f=0; f<[rootcontents count]; f++) {
NSString* thisfile = [NSString stringWithFormat:@"%@", [rootcontents objectAtIndex:f]];
if ([thisfile rangeOfString:@"agent_"].location != NSNotFound) {
int thisfilelength = [thisfile length];
NSString* savedAgentName = [NSString stringWithFormat:@"%@", [thisfile substringWithRange:NSMakeRange(6,thisfilelength)]];
//NSLog(@"%@", savedAgentName);
[savedAgents addObject:savedAgentName];
}
}
感谢。
答案 0 :(得分:7)
如果aRange的任何部分超出接收者的末尾,substringWithRange:
方法将(如文档所述)引发NSRangeException。
通过从thisfile的第6个位置开始请求thisfilelength个字符,你会超过字符串的结尾,从而导致异常。
您需要将请求的长度缩短为6,如下所示:
NSString *savedAgentName = [NSString stringWithFormat:@"%@",
[thisfile substringWithRange:NSMakeRange(6,thisfilelength-6)]];
顺便说一句,这段代码可以简化为:
NSString *savedAgentName =
[thisfile substringWithRange:NSMakeRange(6,thisfilelength-6)];
但是,由于您希望字符串的其余部分来自某个索引,因此使用substringFromIndex:
可以进一步简化此操作:
NSString *savedAgentName = [thisfile substringFromIndex:6];
另请注意,上述所有代码均假定字符串至少包含6个字符。为安全起见,在获取子字符串之前,请检查此文件的长度是否为6或更大。如果长度少于6个字符,则可以将savedAgentName设置为空白。