2011-01-27 3 views
3

Я пытаюсь получить подстроку NSString с использованием substringWithRange: NSMakeRange. Я получаю исходную строку из сохраненного словаря, сохраненная строка записывается как agent_AGENTNAME, я пытаюсь удалить часть agent_. Приведенный ниже код работает отлично (не стесняйтесь критиковать его, если он сырой), если я жесткий код числа в для NSMakeRange - как такNSMakeRange crashing app

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]; 
     } 
} 

Спасибо.

ответ

7

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

Просьба ввести символы этого символа длины, начиная с шестой позиции в этом файле, вы пройдете мимо конца строки, что приведет к исключению.

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

+1

Эй, я не поблагодарил вас за этот ответ, но он многое помог. +1 за то, что научил меня ловить рыбу! – PruitIgoe