gpt4 book ai didi

nsstring - NSMakeRange 崩溃的应用程序

转载 作者:行者123 更新时间:2023-12-01 10:11:09 25 4
gpt4 key购买 nike

我正在尝试使用 substringWithRange:NSMakeRange 获取 NSString 的子字符串。我从保存的字典中获取初始字符串,保存的字符串写为 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];
}
}

谢谢。

最佳答案

substringWithRange: 方法将(如文档所述)引发 NSRangeException “如果 aRange 的任何部分超出接收器的末端”。

通过从该文件的第 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设置为空。

关于nsstring - NSMakeRange 崩溃的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com