Приложение сбоя NSMakeRange - PullRequest
3 голосов
/ 27 января 2011

Я пытаюсь получить подстроку NSString, используя substringWithRange: 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 Ответ

7 голосов
/ 27 января 2011

Метод substringWithRange: вызовет (как утверждают документы) исключение NSRangeException «если какая-либо часть aRange находится за пределами конца получателя».

Запрашивая символы этой длины, начиная с 6-й позиции в этом файле, вы пересекаете конец строки, что приводит к исключению.

Вам необходимо уменьшить запрошенную длину на 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 символов, вы можете установить значение для записанного значения для параметра AgentAame пустым.

...