2012-02-22 6 views
7

이 글은 What's the Point of (NSError**)error?이라는 기존 게시물과 유사하지만 제 질문은 약간 다릅니다. 이중 포인터가 작동하는 방식과 이것이 일반적인 iOS API 오류 패턴 인 방식을 이해합니다. 내 질문은 하나의 포인터 주위에 더, 왜이 코드가 작동하지 않습니다NSError * Nsrror **

NSError *error = nil; 
if(![someObj someMethodWithError:error]) 
{ 
    NSLog(@"Error: %@", [error localizedDescription]); 
} 

왜 메소드 구현의 할당은 포인터를 할당하지 않습니다

- (BOOL)someMethodWithError:(NSError *)error 
{ 
    ... 
    if(errorOccured) 
    { 
    NSError *e = [[[NSError alloc] initWithDomain:@"" code:1 userInfo:nil] autorelease]; 
    error = e; 
    return NO; 
    } 

    return YES; 
} 

를 사용하여 구현 새로운 NSError 객체?

답변

8

포인터를 정수로 생각하는 것이 도움이된다는 것을 발견했습니다. (그게 그 것이다.)

int를 사용하여 예제를 살펴보십시오.

-(BOOL)someMethodWithError:(int)error 
{ 
    error =100; 
    return NO; 
} 

해당 정수는 값 전달 기준입니다. 그 함수를 호출 한 후에는 오류가 변경되지 않습니다.

error = 123; 
    [self someMethodWithError:error]; 
    //error is = 123; 

포인터가 동일한 것입니다. 그것은 가치에 의한 것입니다.

NSError * error; //this assigns this to a value in memory. 
    NSLog(@"%p",error); 
    [self someMethodWithError:error]; 
    NSLog(@"%p",error); // the value of error will not have changed. 

포인터를 변경하려면 해당 포인터에 대한 포인터를 보내고 변경해야합니다. 그것은 혼란 스럽지만 기억의 다이어그램을 그리고 그것에 대해 생각합니다. :)

+1

우수 설명 madmik. 고맙습니다. 포인터가 값으로 전달된다는 것을 이제는 깨닫게됩니다. – Eric

+1

@ madmik3 : 포인터를 "단순한 정수"라고 생각하는 것은 위험 할 수 있습니다.포인터는 주소를 포함하는 변수입니다. C가 포인터에서'++ '와 같은 산술 연산을 사용할 수 있다고해서 포인터가 정수처럼 동작하는 것은 아닙니다. 예를 들어'++'변수에'int'를 쓰면 그 값에 1을 더합니다. 그러나'++'타입의 변수가'int *'* 인 경우 값에 4를 더합니다. – pje

+0

나는 그것들을 똑같은 것으로 생각하지는 않겠지 만, 변수를 전달하는 것에 응답하는 방법을 살펴보면 왜 때때로 이중 포인터가 필요한지 분명해진다. 그것은 단지 예일뿐입니다. :) – madmik3

0

이것은 C 언어의 작동 방식입니다. 당신은이 질문과 대답을 보길 원할 것입니다 : C double pointer, 이것은 기본적으로 다른 모습입니다.

0

errorsomemethodWithError은 someMethodWithError가 호출되는 곳의 오류 주소를 포함하는 다른 포인터입니다. 당신이 someMethodWithErrorerror 포인터에 어떤 객체를 할당 할 때 그래서이는

NSError * error1 = obj1; 
NSError * error2 = error1; 

처럼 그리고 나중에 당신이 좋아 있고 Error2 어떤 새로운 객체를 할당하는 경우

라고 곳에서 방법의 오류 포인터에 반영되지 않습니다

error2 = obj2; 

는 error1의 포인터 값을 변경하지 않으며 여전히

3

그것은 A의 OBJ1 가리 킵니다 이중 포인터에 관해서.

왜 새 값이 표시되지 않습니까? 초기화하지 않은 객체의 내용을 nil로 수정하지 않았기 때문입니다. 이를 수행하려면 nil 값 (단일 포인터를 사용하여 전달하는 값)의 복사본이 아닌 nil 값 (포인터에 대한 포인터)이 저장된 메모리 위치에 대한 참조를 사용해야합니다.

이것은 C의 일부 출력 함수가 입력 인수의 포인터를 통해 "반환 된"경우에 수행하는 것이 일반적입니다.

관련 문제