2011-01-27 11 views
3

substringWithRange : NSMakeRange를 사용하여 NSString의 하위 문자열을 가져 오려고합니다. 저장된 사전에서 초기 문자열을 가져오고 있습니다. 저장된 문자열은 agent_AGENTNAME으로 기록되며 agent_ 부분을 제거하려고합니다. 아래 코드는 경우 (이 원유 경우를 비판 주시기) 잘 작동 나는 하드 코드 NSMakeRange에있는 번호 - 그래서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]; 
     } 
} 

감사 :

여기에 코드의 큰 덩어리입니다.

답변

7

substringWithRange: 메서드는 "aRange의 일부가 수신기의 끝 부분에있을 경우"NSRangeException을 발생시킵니다.

이 파일의 6 번째 위치부터 시작하는이 파일 길이 문자를 묻는 것으로 예외가 발생하는 문자열의 끝 부분을지나갑니다.

당신은 다음과 같은 6가 요청한 길이를 줄일 필요가 : 당신이 전체를 원하기 때문에,

NSString *savedAgentName = 
    [thisfile substringWithRange:NSMakeRange(6,thisfilelength-6)]; 


그러나 : 그런데

NSString *savedAgentName = [NSString stringWithFormat:@"%@", 
    [thisfile substringWithRange:NSMakeRange(6,thisfilelength-6)]]; 

을,이 코드를 단순화 할 수 문자열의 나머지 부분을 특정 색인에서 제외하면 substringFromIndex: :

NSString *savedAgentName = [thisfile substringFromIndex:6]; 
을 사용하여 더욱 단순화 할 수 있습니다.

위의 모든 코드는 문자열이 6 자 이상인 것으로 가정합니다. 안전을 위해 부분 문자열을 가져 오기 전에이 파일의 길이가 6 이상인지 확인하십시오. 길이가 6 자 미만이면 savedAgentName을 공 i으로 설정할 수 있습니다.

+1

이 답변에 대해 고맙지 만 도움이 많이되었습니다. 물고기를 가르쳐 +1! – PruitIgoe

관련 문제