2011-10-18 3 views
28

iOS 5 SDK와 호환되도록 일부 코드를 업데이트 할 때 "Convert to Objective- C ARC "를 입력하고 오류가 발생했습니다. 이 오류는 내 .h 파일의 인스턴스 변수에서 발생합니다.자동 참조 계산 : 명시 적 소유권이없는 non-const 형식 'NSError *'에 대한 포인터

NSError **_error; 

오류는 "명시적인 소유권 const가 아닌 유형 'NSError *'로 포인터를."라고 어떻게 해결할 수 있을까요?

+0

이 질문 (http://stackoverflow.com/questions/6907726/setting-nserror-within-a-block-using-arc 참조)은 내가이 주제에서 찾을 수있는 가장 가까운 것입니다. – Ziminji

+1

왜 인스턴스 변수에 이중 간접 참조를 사용하고 있습니까? NSErrors가 다시 전달 될 수 있도록 메소드 매개 변수에 대해서만 필요합니다. –

+0

@BradLarson ok, (NSError **) : error'를 인수로 취하는 메소드를 호출 할 때'NSError' 인스턴스를 초기화하는 올바른 방법은 무엇입니까 (ARC에서)? – raffian

답변

18

당신은 간단한 포인터로 선언해야 인스턴스 변수에 NSError 객체를 포함 :

@interface Foo : NSObject 
{ 
    NSError *_errror; 
} 

NSError **

은 간접적으로 호출하는 방법에서 NSError 개체를 반환하는 데 사용됩니다. 인스턴스 변수에 저장하는 것은 (아마도) 오류입니다.

54

당신은 니콜라이에 의해 제공되는 예는 다음 구문은이

@interface Foo : NSObject 
{ 
    NSError * __autoreleasing *error; 
} 

과 같을 것이다 있도록 ** 당신이 __autoreleasing을 사용하십시오 NSError를 들어 Transitioning to ARC Release Notes

에 설명 된 평생 예선 중 하나를 사용할 수 있습니다 조금 이상하고 니콜라스 조언을 따라야하지만 NSError **가 제대로 작동하는지 확인해야합니다.

+1

이것은 컴파일되지 않습니다.'NSError * __autoreleasing * _error; '시도하십시오. –

+2

이것은 정답입니다. @NikolaiRuhe 주정부의 답변으로 이것을하는 것은 잘못이 아닙니다. –

+3

답장을 보내 주셔서 감사합니다! 나는 NSArray * __strong * array' 등과 같은 동일한 구문으로 다른 평생 한정자를 사용했다는 점을 덧붙이고 싶습니다. –