0

메모리 위치와 포인터, 그리고 관련된 객체에 대해 좋은 길이의 argument을 얻는 동안 우리는 약간의 두통을 겪었습니다 : setter는 전달 된 객체의 메모리 주소를 서로 같게 설정할 수 있지만, 전달 된 객체는 차례로 연관된 객체가 같은가?setter도 연관된 객체를 "재설정"합니까?

이론적으로 같은 메모리 주소를 공유하는 모든 객체는 동일한 객체를 사용해야하므로 이 동일한 객체입니다. 맞습니까?

답변

4

동일한 메모리 주소를 차지하는 두 개의 Objective-C 개체 (또는 그와 관련된 다른 데이터 구조)를 가질 수 없습니다. * 두 개체가있는 것처럼 보이는 경우 기억의 같은 지점에서, 당신은 사실 하나의 대상을 가지고 있습니다.

포인터를 사용하여 개체에 액세스합니다. 간단한 할당을 사용, 다른 하나의 포인터를 설정 한 경우 :

NSString * s = [NSString stringWithContentsOfFile:@"README"]; 
NSString * t = s; 

는 당신은 하나의 객체에 대한 두 개의 포인터가 있습니다. 개체를 복사 할 필요가 없습니다. 하나의 포인터를 통해 객체의 ivars 중 하나를 변경하면 다른 포인터를 통해 객체를 볼 때 변경된 값을 볼 수 있습니다.


* 전체 학자 인 : 물론, 당신은 ("멜의 이야기"참조) 특정 위치에 데이터를 재 해석 할 수 있지만,이 질문의 범위를 넘어 마술입니다.

+0

Brilliant. 그걸 정리해 줘서 고마워. 부자라면 ... 스트레스? – CodaFi

+0

누가 알겠습니까? 나는 틀린 틀린 틀린 약간의 물건을 확실히 여기에서 썼다. 그는 C++을 생각해봤을지도 모르지만, 할당이 새로운 객체를 생성 할 수 있습니다 (필자는 생각합니다). –

3

당신은 당신이 지나가고 있다고 말할 때, 당신은 지나가는 객체가 아니라 포인터입니다. 그리고 설정되는 것은 메모리 주소입니다.

관련된 개체를 가리키는 메모리 주소가있는 새 포인터가 setter 메서드로 전달되고 내부 개체가 새 주소로 설정되면 이제 양쪽 포인터 (전달 된 집합과 설정된 집합)는 동일합니다. 메모리 주소를 가지며 동일한 연관된 ​​객체를 공유합니다.

+0

죄송합니다. 주석 링크가 끊어져 iPhone 용으로 데스크탑을 사용하고 있습니다. 따라서 인수의 경우 @ mjb162가 옳습니다. – CodaFi

+0

+1, 도와 주셔서 감사합니다. – CodaFi