2012-10-11 5 views
1

V2에서 나를 혼란스럽게 만들었지 만, 아직 조금 궁금해서 V1이 (가)하고 있습니다. V1을 보면 지금은 라인이 가치에 의해 전달되고 있다고 생각합니다. (본질적으로 제가 가지고있는 것은 라인의 로컬 복사본입니다). 스캐너는 그 데이터를 그 로컬 복사본의 주소로 스캔하고, 메소드가 종료되고 외부 변수 라인이 여전히 nil 일 때 로컬 복사본이 파괴됩니다.메서드에 개체 전달?

V2에서 줄의 주소를 전달하고 그 주소로 데이터를 스캔하는 중, 참조로 전달하는 것을 사용하고 있는데, 용어가 확실하지 않은 것입니까?

// V1 
NSString *line = nil; 
[self scanUsing:scanner into:line]; 
NSLog(@"AFTER_: %@", line); 

- (void)scanUsing:(NSScanner *)scanner into:(NSString *)line { 
    [scanner scanUpToString:@"\n" intoString:&line]; 
    NSLog(@"INSIDE: %@", line); 
} 

.

// V2  
NSString *line = nil; 
[self scanUsing:scanner into:&line]; 
NSLog(@"AFTER_: %@", line); 

- (void)scanUsing:(NSScanner *)scanner into:(NSString **)line { 
    [scanner scanUpToString:@"\n" intoString:line]; 
    NSLog(@"INSIDE: %@", *line); 
} 

답변

1

V1

당신은 포인터의 사본을 전달하는 전달합니다. 동일한 메모리 영역을 가리키고 있으므로 동일한 값을 볼 수 있습니다. 값을 기준으로 객체를 전달하고 있습니다. 메서드를 끝내면 포인터가 없으므로 내용을 변경할 수는 있지만 새 객체를 만들 수는 없습니다. 참조

V2

정의 (자사의 C++ 타입) 다른하지만 ​​그래, 그것은 더 많거나 적은 동일하게 동작 말할 수 있습니다. V2에서는 메서드 내에서 새 객체를 할당 할 수 있으므로 포인터가 가리키는 메모리 영역을 변경할 수 있습니다.

그래서 : 값으로 전달

  • V1. 포인터를 전달하면 포인터가 가리키는 객체의 내용을 변경할 수 있습니다.
  • V2, 참고로 전달. 포인터에 대한 포인터를 전달하므로 메모리를 할당 할 수 있으므로 포인터 주소도 변경할 수 있습니다.
1

이것은 C++이 아니기 때문에 참조로 전달할 수 없습니다. 그러나 포인터로 포인터를 호출 할 수 있습니다. (어느 값에 의해 여전히,하지만 당신은 가치에 의해 포인터를 전달하고 있습니다.) 문법 나치에서 별도로

: 첫 번째 버전은 line의 로컬 복사본 수정 (즉를 함수 내부의 하나..) 실제로 전달 된 것은 변하지 않습니다.

+0

많은 감사. – fuzzygoat

1

V1에서는 line 로컬 매개 변수의 값을 변경합니다.이 매개 변수는 메서드의 범위에만 존재하며 line 변수를 변경하지 않습니다.

V2, 당신은 효과적으로 당신이 값을 변경할 수 있습니다 참조로 글로벌 line 포인터, ...

1

첫 번째 예에서는 객체에 대한 참조를 전달합니다. 두 번째 예제에서는 개체 참조에 대한 참조를 전달합니다.

첫 번째 예제에서 line-object를 기록하면 차이가 나타나고 두 번째 예제에서는 메소드 내에 설정 한 객체가 표시됩니다.

이것은 기본 반환 유형이있는 NSError에 자주 사용되지만 오류가 발생했는지 여부도 알려야합니다.그런 다음 오류 변수에 대한 포인터를 전달하고 NSError 개체에 대한 참조를 전달합니다. 나는 이것이 당신에게 조금 의미가 있었으면 좋겠다.