Obj-C 서적을 읽는 중이고 계속 진행되고 있습니다.getter 및 setter 루틴 이해
main.m
기능에서 내 응용 프로그램의 코드가있다 :
XYPoint *theOrigin = [myRect origin];
[theOrigin setX:200];
[theOrigin setY:300];
내가 실제로, 나는 싶지 않았다 목적으로했다 :
당신이 볼Rectangle *myRect = [[Rectangle alloc]init];
XYPoint *myPoint = [[XYPoint alloc]init];
[myPoint setX:100 andY:200];
myRect.origin = myPoint;
XYPoint *theOrigin = [myRect origin];
[theOrigin setX:200];
[theOrigin setY:300];
NSLog(@"Test %i and %i", theOrigin.x, theOrigin.y);
NSLog(@"Origin at (%i, %i)", myRect.origin.x, myRect.origin.y);
, 내가 다음 코드를 삽입 변경할 값. Rectangle.m 파일에서 나는 다음과 세터 방법을 수정 :
-(void)setOrigin:(XYPoint *)pt{
if (!origin){
origin = [[XYPoint alloc]init];
origin.x = pt.x;
origin.y = pt.y;
}
}
기원이 0이 아닌 경우 (내가 올바른 이해한다면) 그래서 논리는, 변경할 수 없습니다. 그러나 NSLog는 여전히 200과 300의 값을 출력하므로 첫 번째 선언 이후에 변경 되었습니까? 시도는이처럼 내 된 Xypoint 클래스를 수정하는
:
[myPoint setX:50 andY:50];
NSLog(@"Origin at (%i, %i)", myRect.origin.x, myRect.origin.y);
나는 같은 결과를 얻었다. 혼란 스럽다.
나는 (복사본을 생성하는 대신 복사본을 반환하는) 다음과 같은 getter 메소드를 수정하려고 :
-(XYPoint*)origin{
if (origin){
XYPoint *copy = [[XYPoint alloc]init];
copy = origin;
NSLog(@"Copy will be returned");
return copy;
} else {
return origin;
}
}
을하지만 여전히 여기에 문제를 표시 및 출력 같은이 값이 계속 변경. 이 문제를 방지하기 위해 getter 메소드를 수정하는 방법은 무엇입니까?
왜 그런가요? 이것을 방지하는 방법? 조언을 주시면 감사하겠습니다.
Rob, 고맙습니다. 왜 [myPoint setX : 50 andY : 50]을 추가할까요? 코드는 변경되지 않았습니까? NSLog (@ "출처 (% i, % i)", myRect.origin.x, myRect.origin.y); 같은 값을 출력하고,이 경우에는 myPoint 클래스를 변경할 수 있습니다. –
'myRect.origin = myPoint;'에서'myPoint'를 실제로 사용하지 않고'XYPoint'를 인스턴스화하고'x'와'y'를 설정하는'setOrigin' 메소드를 호출합니다 (behaving 'copy' 메모리 의미론을 가진 속성과 같이 선언되지는 않았지만). 따라서'myPoint'를 변경하려는 시도는'setOrigin'이 생성 한 새로운'XYPoint'에 영향을 미치지 않습니다. 그러나 일단 사각형의'origin' getter를 호출하여이 객체에 대한 참조를 검색하면'x'와'y'가 변형되도록 허용합니다. – Rob
귀하의 자세한 답변을 주셔서 감사합니다, 지금 내 마음 속에 그림이 분명하고, 나는 또한 이제 readonly 속성의 의미를 얻습니다. 그래도 한 가지 더있어, myRect.origin의 값을 변경하지 못하도록 기존 getter 메서드를 수정하는 방법을 알고 싶습니다. 몇 가지 팁을 적어주세요. 하단의 수정 된 질문을보십시오. 감사합니다 –