2015-01-18 5 views
1

문자열 배열을 쉼표로 구분 된 단일 문자열로 변환하는 작업의 경우 아래 NSString 접근 방식 또는 NSMutableString 접근 방식에 큰 이점이 있는지 궁금합니다. (두 경우 모두, allNames는 NSStringsNSArray입니다.)루프에서 NSString 또는 NSMutableString을 사용하는 것이 더 좋습니다.

는 NSString 접근

NSString *listOfNames=[allNames objectAtIndex:0]; 
for (int i=1;i<[allNames count];i++){ 
    NSString *thisName=[allNames objectAtIndex:i]; 
    listOfNames=[listOfNames stringByAppendingFormat:@", %@",thisName]; 
} 

인 NSMutableString 접근

NSMutableString *mutableListOfNames=[[NSMutableString alloc] init]; 
[mutableListOfNames appendString:allNames[0]]; 
for (int i=1;i<[allNames count];i++){ 
    NSString *thisName=[allNames objectAtIndex:i]; 
    [mutableListOfNames appendFormat:@", %@",thisName]; 
} 
NSString *listOfNames=[NSString stringWithString:mutableListOfNames]; 
+1

차이점은 'NSString'접근법은 짧은 시간 안에 많은 객체를 생성하고 해제한다는 것입니다. NSMutableString이 이것을 피하는 반면. 귀하의 프로그램이 ARC에 의해 관리되기 때문에 장기적으로 큰 차이를 만들지 못할 수도 있습니다. –

+0

문자열 결과가 다음과 같이 보이는지 확인하십시오 :'@ ", foo, bar"'? – ThomasW

+4

모든 코드를 한 줄로 바꿀 수 있습니다 :'NSString * listOfNames = [allNames componentsJoinedByString : @ ","]; – rmaddy

답변

2

예, NSMutableString이 경우에 사용하는 것이 좋습니다. 많은 수의 객체를 생성하는 문제를 피할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 내가 궁금해 한 것입니다 : NSString 접근 방식에서 thisName이 지속적으로 "중첩 된"경우 thisName의 각 후속 값이 실제로 저장됩니다 (루프의 각 반복 후에 무시됩니다). – Rogare

+0

또한 ARC 하에서는 큰 문제가 아니지만이를 해제해야하는 번거 로움을 피할 수 있습니다. – SevenBits

+0

논쟁의 여지가 있지만 (또한 측정 가능합니다.) NSMutableString 구현은 실제로 불투명하지만 마술이 아닙니다. 문자열이 커지면 할당이 수행됩니다. 그러한 할당이 "불변"(즉, 적은 수의) 불변 인 NSString을 생성하고 폐기하는 경우 발생하는 것보다 더 똑똑한 지 여부는 경험적으로 반드시 측정해야 할 것입니다. 당신이 무거운/큰 문자열 조작을 많이하지 않는 한, 차이점은 실제로는별로 중요하지 않습니다. – ipmcc