NSMakeRange崩溃的应用程序

时间:2011-01-27 02:51:41

标签: nsstring substring

我正在尝试使用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];
      } 
 }

感谢。

1 个答案:

答案 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设置为空白。