2009-07-21 3 views
16

가능한 중복은 :
How do I concatenate strings in Objective-C?Objective-C (iPhone)에서 문자열을 연결하는 방법은 무엇입니까?

첫째, 플랫폼은 아이폰과 label.text 표시 라벨을 변경합니다. 이 시나리오를 고려하십시오.

정수 배열이 있습니다. 그리고 그것을 화면에 표시하고 싶습니다.

는 여기에 내 걸릴 : 당신은 아마 볼 수 있듯이

-(IBAction) updateText: (id)sender { 
    int a[2]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    for (int i=0; i<=10;i++) 
    label.text = [NSString stringByAppendingString: [NSString stringWithFormat: @"%i", a[i]]]; 
} 

, 나는 꽤 혼란 스러워요. Pls는 PLS 나 좀 도와 :(

+0

조금 늦었지만 크기가 2 인 배열을 초기화하면 가장 높은 인덱스는 1이되지만 [2] = 3; 범위를 벗어난 오류가 발생할 수 있습니다. – Jonny

답변

35

이 시도 :

NSMutableString* theString = [NSMutableString string]; 
for (int i=0; i<=10;i++){ 
    [theString appendString:[NSString stringWithFormat:@"%i ",i]]; 
} 
label.text = theString; 
+0

이것은 NSMutableString에서만 가능합니다. 나는이 모든 다른 수업과 그들의 방법들과 혼동을 느낀다. ... 그러나, 남자. 이것은 내가 필요한 것입니다. :) – r0ach

+0

appendString :은 NSMutableString에만 있지만 비슷한 함수는 NSString의 stringByAppendingString :입니다. –

+1

@TomDalling : 동일한 접근법을 사용했지만 append가 수행되는 델리게이트가 여러 번 호출되기 때문에 'theString'은 .h 파일에서 선언됩니다. 자,이 경우 나는 빈 'theString'을 얻고있다. 어떤 문제가 있습니까? –

3

또 다른 방법 인 NSMutableString을 사용하지 않고 :

-(IBAction) updateText: (id)sender { 
    int a[3]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    NSString *str = @""; 
    for (int i=0; i<3;i++) 
     str = [str stringByAppendingFormat:@"%i ",i]; 
    label.text = str; 
} 
:

여기
NSString* theString = @""; 
for (int i=0; i<=10;i++){ 
    theString = [theString stringByAppendingFormat:@"%i ",i]; 
} 
label.text = theString; 

이 (당신의 범위를 수정) 전체 구현입니다

쉼표로 구분 된 목록을 원할 경우 다음과 같이 할 수도 있습니다.

-(IBAction) updateText: (id)sender { 
    int a[3]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3]; 
    for (int i=0; i<3;i++) 
     [arr addObject:[NSString stringWithFormat:@"%i",i]]; 

    label.text = [arr componentsJoinedByString:@", "]; 
} 
+1

내 LISP 프로그래머가 NSMutableString보다 NSString 접근법을 선호하지만 실제로는 첫 번째 솔루션의 메모리 영향에주의해야합니다. 이러한 작은 루프의 경우 큰 문제는 아니지만 메모리의 O (n^2)이며 iPhone의 수명이 짧은 메모리 스파이크가 문제가 될 수 있습니다. –

+0

매우 사실입니다. 이러한 이유로 배열 메서드가 훨씬 더 좋습니다. ([NSMutableArray alloc] 및 [arr release]를 수행했다면 여전히 좋을 것입니다 ...) 또한 목록 시작 또는 끝 부분에 쉼표 또는 공백이 누락되지 않도록 조인 문자열에 유연성을 추가합니다. – Benjie

17

루프를 사용하고 있으므로 Tom과 Benjie의 솔루션에 다소주의를 기울여야합니다. 그것들은 반복마다 자동으로 객체를 추가로 만듭니다. 작은 루프의 경우에는 괜찮지 만 루프의 크기가 제한되지 않거나 문자열이 클 경우 매우 큰 메모리 스파이크 및 성능 저하가 발생할 수 있습니다. 특히 iPhone의 경우 메모리 부족으로 인해 놀라운 메모리 문제가 발생할 수있는 루프 유형입니다.

다음 솔루션은 메모리 사용 공간이 더 적습니다 (입력 속도가 약간 빨라지고 타이핑 횟수가 적음). -appendString 대신 -appendFormat:에 대한 호출을 기록하십시오. 이렇게하면 버려 질 두 번째 문자열이 생성되지 않습니다. 최종 문자열에는 마지막에 제거 할 수있는 여분의 공간이 있음을 기억하십시오. 첫 번째 또는 마지막 반복을 다르게 처리하거나 루프 이후의 마지막 공간을 다듬어 해결할 수 있습니다.

NSMutableString* theString = [NSMutableString string]; 
for (int i=0; i<=10;i++){ 
    [theString appendFormat:@"%i ",i]; 
} 
label.text = theString; 

[NSArray componentsJoinedByString:]을 잊지 마세요. 이 경우에는 NSArray가 없지만 일반적으로 어디에서 작업 하느냐에 따라 원하는 것을 얻을 수있는 최선의 방법 일 수 있습니다.

7
//NSArray *chunks 
string = [chunks componentsJoinedByString: @","];