我需要从大字符串 0,5mb 中提取多个变量到数组中。当输入字符串较小 ~50kb 且要查找大约 100 个项目时,此脚本将起作用。但目标是从 0.5MB 字符串中提取大约 7k 个项目。当少于 300 个项目时,它可以工作。但几秒钟后完成。但是,如果更多我遇到问题:
Communications error: <OS_xpc_error: <error: 0x321f9614> { count = 1, contents = "XPCErrorDescription" => <string: 0x321f986c> { length = 22, contents = "Connection interrupted" }
法典
NSUInteger count = 0, length = [dataString length];
NSRange range = NSMakeRange(0, length);
while(range.location != NSNotFound)
{
range = [dataString rangeOfString: @"userID_X" options:0 range:range];
if(range.location != NSNotFound)
{
range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
count++;
}
}
NSLog(@"Count:%i",count);
realTokens = [NSMutableArray new];
realIds = [NSMutableArray new];
for (int gg=0; gg<count-1; gg++) {
NSArray *realidtemp;
NSArray *realtokentemp;
realidtemp = [[[dataString componentsSeparatedByString:@"userID_X"]objectAtIndex:1] componentsSeparatedByString:@"."];
realtokentemp = [[[dataString componentsSeparatedByString:@"userToken"]objectAtIndex:1] componentsSeparatedByString:@"."];
NSString *checkTkn = realtokentemp[0];
NSString *checkId = realidtemp[0];
if (![checkTkn containsString:@"EMPTY"] && ![checkId containsString:@"EMPTY"]) {
[realTokens addObject:checkTkn];
[realIds addObject:checkId];
NSString *fix1 = @"userToken";
NSString *fix2 = @"userID_X";
fix1 = [fix1 stringByAppendingString:checkTkn];
fix2 = [fix2 stringByAppendingString:checkId];
dataString = [dataString stringByReplacingOccurrencesOfString:fix1 withString:@"EMPTY"];
dataString = [dataString stringByReplacingOccurrencesOfString:fix2 withString:@"EMPTY"];
}
}
您可以使用与字符数成比例的运行时执行许多操作。这是你需要避免的。您还创建了大量巨大的自动释放字符串。每次调用字符串时...创建一个新的 0.5MB 字符串。在具有1GB RAM的iPhone上,2,000个呼叫完全填满了您的RAM,但您会更早崩溃。componentsSepardByString同样糟糕。
为结果创建一个 NSMutableString,并且只添加要添加的部分。请不要问该怎么做。