2012-05-17 4 views
1

그래서 정확히 내가 가지고있는 문제의 종류 인 것 같아서 this 질문을 읽었지 만 해당 게시물의 대답이 내 문제를 해결하지 못합니다. NSMutableData의 데이터 직렬화 하위 클래스를 작성하려고합니다.ARC로 출력 매개 변수 사용

-(void)readString:(__autoreleasing NSString **)str 

내가 특정을 얻을 수있는 기능의 일부 데이터 조작은 데이터 스트림에서 다음 문자열에 대응 바이트 않고, 나는이 선 전화 : 문제가있는 기능 헤더는 다음과 같습니다

*str = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding]; 

이 코드에는 오류가 없습니다. 내가 그렇게 같은 함수를 호출하려고 할 때 : 나는 앞에 __autoreleasing를 배치 시도

Passing address of non-local object to __autoreleasing parameter for write-back

: 나는 실제로 함수를 호출 할 경우 라인에

+(id) deserialize:(SerializableData *)data 
{ 
    Program *newProgram = [[Program alloc] init]; 

    [data readString:&(newProgram->programName)]; 

을, 나는 다음과 같은 오류가 발생합니다 첫 번째 * 앞에있는 NSString 선언과 두 * 사이에있는 모든 구성에서는 오류가 발생합니다.

다른 질문을 읽을 때 뭔가를 놓친 적이 있습니까? 아니면 ARC 컴파일러에서 게시물을 게시 한 이후로 변경된 사항이 있습니까?

편집 :

이 문제가 내가 문자열에 액세스하려고하는 방식에서 오는 것으로 보인다. 나는 이런 식으로 뭔가를 수행하여 해결할 수 있습니다

NSString* temp; 
[data readString&(temp)]; 
newProgram.programName = temp; 

하지만 난 오히려 바르

+3

할당 된 값이 자동으로 해제되기 때문에 ivar을 직접 사용할 수 없습니다. Autorelease는 항상 ivars에 좋지 않은 아이디어이므로 ARC가 허용합니다. 로컬 변수 'temp'를 사용하면 ARC가 필수 retain을 추가합니다. –

답변

1

당신은 할 수 없습니다에 직접 액세스 할 수있다. LLVM의 문서 Automatic Reference Counting, 특히 4.3.4 절에서 통찰력을 얻을 수 있습니다. "쓰기 되돌림으로 out 매개 변수로 전달". 그러나, 당신이 이미 알아 낸 것 이외에 그렇게 할 수없는 것보다 더 많은 세부 사항은 없습니다 (구체적으로, "법적 형식"에 열거되지 않습니다). 어쩌면 당신은 그 이론적 근거를 흥미로울 것입니다.

+0

흠, 불행히도 나는 그 ivars에 직접 액세스 할 수 없다고 생각합니다. 나는 아직도 C++ 프로그래머의 마음이 너무 심하다 고 생각합니다. 글쎄,이 문서를 읽어 주셔서 감사합니다. –