문제

Objective-C의 변수는 메모리 어딘가에있는 객체에 대한 언급 일 뿐이라고 생각했습니다. 따라서 내 이해를 위해 결과는 "하나"였을 것입니다. 결국 나는 str1의 객체의 메모리 주소를 str2에 할당했고, 이전에는 str2의 메모리 주소를 테스트 할 수 있었기 때문입니다.

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];

test = str2; // test is an instance variable. I use no getter/setter here! just for testing!
str2 = str1;
NSLog(test); // = "two" ??
도움이 되었습니까?

해결책

이것이 포인터의 작동 방식입니다. 당신이 보는 결과는 정상적이고 정확합니다.

모든 변수와 그들이 선언 된대로 메모리에서 어떤 문자열을 가리키는지를 나열해 봅시다.

str1 -> "One"
str2 -> "Two"

그런 다음 몇 가지 과제 지침을 실행합니다.

test = str2;

이것은 포인터의 값을 할당합니다 str2 에게 test. 그래서 포인터입니다

str1 -> "One"
str2 -> "Two"
test -> "Two"

그 다음에

str2 = str1;

포인터의 값을 할당합니다 str1 에게 str2. 이제 포인터가 있습니다

str1 -> "One"
str2 -> "One"
test -> "Two"

그런 다음 인쇄합니다 test, 그것은 무엇을 가리키고 있습니다 str2 원래 "2"를 가리키고있었습니다.

당신이 할당 한 이후로 당신은 그렇게 생각합니다 str2 의 가치에 str1, 그리고 test 의 가치에 str2, 그 가치 str1 어떻게 든 캐스케이드 test. 그렇지 않다. 한 번 test의 가치가 할당되며 해당 값이 어디에서 왔는지에 관한 정보가 손실됩니다. 네가 원한다면 test의 가치는 동일합니다 str1과제 작업의 순서를 뒤집을 수 있습니다.

str2 = str1;
test = str2;

다른 팁

당신은 이것을 가지고 있습니다 :

test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??

이제 모든 변수가 ints 인 척해 봅시다.

첫 번째 줄에서 변수 test 변수 값으로 설정됩니다 str2. 두 번째 줄에서 변수 str2 변수 값으로 설정됩니다 str1. 세 번째 줄에서 우리는 값을 인쇄합니다. test, 그리고 그것은 실제로 그 가치입니다 str2 우리가 할당했을 때였습니다 str2 테스트합니다. 우리가 이후에 할당 한 것은 전혀 중요하지 않습니다. str2 다른 가치.

좋아요, 그러나 변수는 실제로 포인터입니다. ints가 아닙니다.

상관없이 : 포인터를 숫자로 생각하면 메모리 어딘가의 주소라고 생각하십시오. 그리고 NSLOG에 전달하면 NSLOG 인쇄물이 포인터의 값이 아니라 포인터가 가리키는 것의 값, 즉 숯의 배열이됩니다.

변수는 컨테이너입니다. 과제는 오른쪽에있는 모든 것을 취하고 왼쪽에있는 모든 것에도 넣습니다. 다시 말해, 한 변수에서 다른 변수로 값을 복사합니다. 이 경우 해당 값은 포인터 (메모리 주소)입니다.

그래서 당신이 한 일은 다음과 같습니다.

  1. 안에있는 주소를 가져 가십시오 str2 변수 및 동일한 주소를 test 변하기 쉬운.
  2. 안에있는 주소를 가져 가십시오 str1 변수 및 동일한 주소를 str2 변하기 쉬운.

2 단계는 영향을 미치지 않습니다 test 변하기 쉬운; 해당 변수에 대한 유일한 할당은 1 단계에있었습니다.

중요 : 당신은 복사하지 않습니다 무슨 일이야 주소; 당신은 복사하고 있습니다 주소 자체. 여전히 하나의 "두"문자열 만 있지만 1 단계와 2 단계 사이 주소 그 대상 중 두 가지가 있습니다 str2 그리고 test. 그런 다음 2 단계에서 주소를 대체합니다. str2 "One"문자열의 주소로 str1, 떠날 test 여전히 "2"문자열의 주소를 보유하는 유일한 변수입니다.

btw, stringWithCString: 더 이상 사용되지 않습니다. 사용 stringWithUTF8String: 또는 stringWithCString:encoding: 대신에.

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