Objective-c 从大字符串中提取多个变量(性能改进)



我需要从大字符串 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,并且只添加要添加的部分。请不要问该怎么做。

最新更新