2012-07-26 5 views
4

그래서 NSError 개체에 대한 포인터를 메서드에 전달하는 곳에서 일반적인 작업을 수행하고 있습니다. 그것은 단순하게 사용 :iOS __autoreleasing const 오류

-(BOOL)foo:(NSString *)string error:(NSError **)error 

하지만 ARC으로는 지금 : 그래서

-(BOOL)foo:(NSString *)string error:(NSError *__autoreleasing *)error 

내가 변수가있는 경우 :

NSError *error = nil; 

및 시도 :

[foo:@"a string" error:&error]; 

오류가 발생합니다 :

Sending 'NSError const __strong*' to parameter of type 'NSError *__autoreleasing*' changes retain/release properties of pointer. 

컴파일러가 처리 할만한 인상을 받았지만 괜찮습니다. 그래서 오류합니다

__autoreleasing NSError *error = nil; 

을 나는 경고 얻을 :

Sending 'NSError *__autoreleasing const *' to parameter of type 'NSError *__autoreleasing*' discards qualifier 

그래서 내 진짜 문제는 내 NSError CONST 이유입니다을? 그리고 다음 질문은 어떻게 해결할 수 있을까요? 이것은 매우 기본적인 상황입니다. ARC를 사용하면이 문제를 처리하는 방법을 모르겠습니다.

답변

4

Apple 헤더에서 인터페이스 설명에 __autoreleasing이 필요 없음을 볼 수 있습니다 (즉, NSFileManager attributesOfFileSystemForPath에 대한 헤더 파일을보십시오). 내가 ARC가 활성화가 나는 놀이 샘플 프로젝트를 가지고, 난 그냥 아무 문제없이 이런 짓을 :

(NSError **) 

대신

(NSError *__autoreleasing *) 

편집 : 그래서 사용

-(BOOL)foo:(NSString *)string error:(NSError **)error 
{ 
    return YES; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    __autoreleasing NSError *err = nil; 
    [self foo:@"glop" error:&err]; 
    NSLog(@"%@", err); 

잘 컴파일됩니다.

+0

이 기괴한입니다. 그것은 내가 이것을하게하지 않을 것입니다. 비록 매개 변수 이름을 다른 것으로 변경하더라도 NSError 포인터가 들어오는 것을 보게되면 허용하지 않고 원래 오류를 제공합니다. – mickm

+0

인터페이스와 구현이 변경되었습니다. 맞습니까? 지금 샘플 프로젝트에서 테스트 해 보겠습니다 ... –

+0

방금 ​​비슷한 프로젝트를 만들었고 잘 작동합니다. 어떻게 든 나는 무엇인가 놓치고 있어야한다. 그러나 나는 그것이 무엇인지 알지 못한다. 나는 좀 더 보게 될 것이다. 오, 나는 __autoreleasing도 사용하지 않았고 여전히 오류없이 컴파일했다. – mickm

1

이 엑스 코드 4.4에서 나를 위해 작동 :

- (BOOL) foo: (NSString*) string error: (out NSError *__autoreleasing *) outError; 
+0

4.3.3에 있습니다. 아무런 변화가 없습니다. 나는 여기서 뭔가를하고있을거야,이게 중요한 문제는 아니지만, 나는 거의 아무것도 찾지 못했다. – mickm