문제

아래 코드는 컴파일 및 실행되지만 모든 iPhone 개발 서적과 Apple 문서에 따르면해서는 안됩니다! 누군가가 불변의 nsstring이 설정 한 후에 그 값을 변경할 수 있는지 설명해 주시겠습니까? 동일한 문자열 변수의 컨텍스트를 변경하기 위해 NSMuttableString을 사용해야한다고 생각 했습니까? SDK 3.1을 사용하고 있습니다.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
도움이 되었습니까?

해결책

아마도 다음 예는 Mark와 Niels의 답변을 추가하고 사물을 명확하게하는 데 도움이 될 것입니다.

불변의 현

// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;

// "Replace" the second string
str2 = @"Hello ikilimnik";

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

변한 문자열

// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;

// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

불변의 nsstring 클래스를 사용할 때 문자열을 "교체"하는 유일한 방법은 새 문자열을 만들고 변수 "str2"를 업데이트하여 가리키는 것입니다. 그러나 이것은 "str1"이 가리키는 것에 영향을 미치지 않으므로 원래 문자열을 참조합니다.

NSMutableString 예제에서, 우리는 두 번째 문자열을 만들지 않고 대신 기존 "hello world"문자열의 내용을 변경 (돌연변이)합니다. 두 변수 모두 동일한 문자열 객체를 계속 지적하기 때문에 모두 NSLOG에 대한 호출의 새 값을보고합니다.

포인터 변수와 실제 객체를 가리키는 것이 중요합니다. nsstring 객체는 불변이지만 문자열을 가리키는 변수의 값을 변경하는 것을 막지는 않습니다.

데이터 유형 "nsstring *"은 객체 자체가 아닌 nsstring 객체에 대한 포인터입니다. Xcode 디버거 내의 NSLOG 문 중 하나에서 중단 점을 설정하면 각 변수의 원시 값을 확인하여이를 명확히 할 수 있습니다.

다른 팁

당신은 문자열을 돌연변이하는 것이 아니며, 변수 테스트를 다른 문자열을 가리 키도록 재 할당합니다. 원래 문자열이 수정되지 않았습니다.

Test 및 Test2는 *테스트 포인터가 가리키는 두 개의 다른 문자열입니다.

첫 번째 코드 줄에서 명시 적으로 할당 된 NSString 객체의 내용을 변경하지 않고 *다른 객체로 테스트합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top