2012-08-08 5 views
3

이 질문은 매우 기본적인 질문 인 것으로 알고 있습니다 만, 나는 항상 기본 질문을 설명하고 이해하는 것이 깨끗하고 작동 가능한 코드를 구축하는 열쇠라고 생각했습니다. 오류를 생성 할 때 나는 유명한 '잠재적 널 역 참조'를 얻을 엑스 코드에서 '분석'실행하여NSError를 다룰 때 '잠재적 인 null dereference'이해하기

-(BOOL)validateForInsert:(NSError *__autoreleasing *)error { 
    [super validateForInsert:error]; 
    return [self validateInternal:error]; 
} 

-(BOOL)validateInternal:(NSError *__autoreleasing *)error { 
    // checking attributes and build userInfo error 
    if(anyErrors) { 
    *error = [NSError errorWithDomain:appDomain code:200 userInfo:details]; 
    return NO; 
    } 
    return YES; 
} 

: 은 내가 CoreData 개체에서 다음 코드 조각이있다. 컴파일러는 경고를하지 않고 코드는 항상 작동합니다. 이것은 컴파일러가 저에 대해 경고하지 않는 이유는 무엇입니까?

코드에 와서 나는 해결책을 알고있다. (오류! = nil)을 확인하는 것이지만, 나는 이것에서 아주 길을 잃는다. 질문은 NSError * _autoreleasing *의 의미에서 처음부터 시작합니다. 왜 주변의 별이 맞습니까? 어떤 포인터에 대한 포인터가되어야합니까?

validateForInsert를 호출하려면 다음과 같이 가정합니다. * _autoreleasing * 객체를 어떻게 만들 수 있습니까?

다음 질문은 위의 질문과 관련 있다고 생각합니다. 처음부터 오류를 작성하는 경우 왜 처음부터 nil인지 확인해야하는 이유는 무엇입니까?

마지막으로 중요한 것은 코드가 제대로 작동하고 오류가 가로채는 경우입니다. 오류가 발생하거나 중단 될 수있는 사례를 발견 할 수 있습니까? CoreData를 사용하고 있다고 말했기 때문에, 일반적인 예가 좋지만 CoreData와 관련된 또 다른 예가 좋습니다.

감사

답변

3
*error = [NSError errorWithDomain:appDomain code:200 userInfo:details]; 

따라서 컴파일러는 경고하지 않고, 올바른 구문입니다. 이 분석기는

NSError *error; 
[myObj validateForInsert:&error]; 

은 다음 error의 주소를 전달 호출하는 경우는

[myObj validateForInsert:NULL]; 

를 호출하는 경우이 따라서 당신이 유형 NSError * *의 변수를 전달, error = NULL 경우 런타임에, 즉 충돌합니다 검색합니다.

__autoreleasing 수정자는 error에 할당 된 객체가 자동 반복 된 객체라는 ARC 컴파일러에 대한 힌트입니다.

당신은 변수가

NSError * __autoreleasing error; 
[myObj validateForInsert:&error]; 

로 autoreleasing 할 수 있지만, 일반적으로 당신은 상관하지 않습니다 선언 할 수 있습니다. ARC는 올바른 코드를 생성합니다.

자세한 내용은 Transitioning to ARC Release Notes을 참조하십시오. stackoverflow에 대한이 주제에 대한 답변도 많이 있습니다.

+0

나는 autoreleasing의 의미를 완전히 잃어 버렸고, 변수 이름으로 생각했다 !! 설명 주셔서 감사합니다, 저를 위해 그것은 답변으로 표시하는 것으로 충분합니다. – Leonardo

+0

반갑습니다. –

관련 문제