2011-03-14 5 views
0
NSString *s1 = @"string1"; 
// NSString *s2 = [[NSString alloc]stringWithFormat:@"string2"]; 
NSString *s2 = [[NSString alloc] initWithFormat:@"string2"]; 

나는 이것이 매우 기본적인 개념이라는 것을 알고 있지만 이것으로 100 % 명확하지는 않습니다.목표 C, NSSting과 "alloc"과 "alloc"의 차이점

첫 번째는 메모리 주소를 할당하지 않고 하나는 메모리 주소를 할당합니다 ... 두 번째 것은 첫 번째 주소가 아닌 변수의 참조 횟수를 늘립니다 ... 개념을 이해하지만 첫 번째 또는 두 번째를 사용해야하는 상황을 알지 못합니다.

언제 첫 번째를 사용해야합니까? 둘째로 사용해야 할 때도 있습니까? 사전에

감사합니다 ..

+0

John의 관찰에 따라 코드가 수정되었습니다. – bbum

답변

4

두 번째 코드는 절대 사용하지 마십시오. +stringWithFormat:은 클래스 메소드입니다. 이 경우

NSString *s1 = @"string1"; 
NSString *s2 = [[NSString alloc] initWithString:@"string2"]; 
NSString *s3 = [NSString stringWithFormat:@"string3"]; 

s1는 상수 문자열에 대한 포인터입니다 : 첫 번째 예를 포함, 당신은 기본적으로 3 개 선택 사항이 있습니다. s2s3은 새로 생성 한 문자열을 가리키고 있지만 s2은 그대로 유지되고 s3은 자동으로 리사이징되었습니다. 임시 객체 만 필요하면 자동 다시 렌더링 된 객체 s3 또는 상수 객체 s1이 좋습니다. 문자열을 주변에 유지해야하는 경우 s2을 사용해야합니다. 실제로이 경우 s1도이 경우에도 작동합니다. 그러나 실제로는 관용적이지 않습니다.

당신은 그들에게 retain 메시지를 보내는 방법으로 s2s1 또는 s3가 상당 할 수 있습니다. 메시지 autorelease을 보내어 s2을 해당 객체로 바꿀 수도 있습니다.

+0

정말 고마워요! – codereviewanskquestions

1

@"string1" (또는 두 번째 줄에 @"string2")와 같은 문자열 리터럴하면, 할당을하지 언급 한대로이다. 문자열은 실제로 선언 한 상수처럼 실행 파일의 데이터 섹션에 상수로 저장됩니다. 이 방법으로 생성 된 문자열에는 참조 카운트가 없습니다. 당신은 그들에게 -retain-release 메시지를 보낼 수 있으며 아무 일도 일어나지 않을 것입니다.

두 번째 줄이 잘못되었습니다. +stringWithFormat:은 실제로 클래스 메서드이며 어떤 형식 매개 변수도 사용하지 않고 +stringWithFormat:을 사용하는 것은 실제로 의미가 없습니다. 일반적으로 다른 양식을 사용해야하는 구체적인 이유가없는 경우 문자열 리터럴 양식 만 사용하십시오. 응용 프로그램 주위에 이미 상수가있는 경우 새 객체를 할당 할 필요가 없습니다.

1

상수 문자열을 전달하려는 경우 ...WithFormat: 메서드를 사용하지 마십시오. 사소한 경우에 대해 형식 문자열을 구문 분석 할 필요가 없습니다.

+1

그것은 불필요한 할당을 일으킬 것이다. – bbum

8

칼이 맞지만 마음에 두는 미묘한 부분이 있습니다. 이것을 고려하십시오 :

NSString *s1 = @"string1"; 
NSString *s2 = [[NSString alloc] initWithString:@"string1"]; 
NSString *s3 = [NSString stringWithString:@"string1"]; 
NSString *s4 = [NSString stringWithFormat:@"string1"]; 

NSLog(@"ptrs %p %p %p %p", s1, s2, s3, s4); 

을 출력은 다음과 같습니다 맞아

ptrs 0x1000010c0 0x1000010c0 0x1000010c0 0x100108da0 

; s1, s2s3은 모두 동일한 문자열 인스턴스를 가리키며 s4은 새 인스턴스가됩니다.NSString은 문자열이 상수 문자열에서 초기화 될 때이를 감지하고, 그렇게 할 때 완전히 유효 할 때 똑같은 것을 유지하기 위해 새로운 메모리 덩어리를 할당하는 대신에 상수 문자열을 반환하기 때문입니다. stringWithFormat:의 경우는 가능한 모든 형식 문자열 처리로 인해 이러한 최적화가 실현되지 못하고 구현에 부 자연스러운 것이므로 최적화되지 않은 것 같습니다.

즉, 이 아닐 경우은 코드 검사 또는 포인터 비교만으로 두 문자열이 동일하거나 다른 것으로 가정합니다. isEqual: 또는 더 나은 것은 isEqualToString:을 사용하십시오.

+0

+1 @bbum ... 좋은 설명, 감사합니다! –