6

CFStreamCreatePairWithSocketToHostNSInput - 및 OutputStream과 함께 사용하고 싶습니다. 나는 두 개의 ivars NSInputStream *_inputStreamNSOutputStream *_outputStream을 가지고있다. 'CFReadStreamRef *'에 대한 Objective-C 포인터에 대한 간접 포인터의 캐스트가 ARC와 함께 허용되지 않습니다.

CFStreamCreatePairWithSocketToHost(NULL, 
    (__bridge_retained CFStringRef)self.hostname, self.port, 
    (CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream); 

error: cast of an indirect pointer to an Objective-C pointer to ' CFReadStreamRef * ' (aka ' struct __CFReadStream ** ') is disallowed with ARC
error: cast of an indirect pointer to an Objective-C pointer to ' CFWriteStreamRef * ' (aka ' struct __CFWriteStream ** ') is disallowed with ARC

가 어떻게이 문제를 해결할 것입니다 :

다음은 나에게 두 오류 메시지를 준다? __bridge을 사용해 보았지만 비슷한 오류 메시지가 나타납니다.

답변

4

실제 CFReadStreamRefCFWriteStreamRef 변수에 대한 포인터를 전달한 다음 NST 유형에 할당 할 때 캐스트합니다. 기본적으로 :

물론
CFThingRef cfThing = NULL; 
CFFunctionGetThing(&cfThing); 
NSThing * nsThing = cfThing; 

, 당신은 cfThing에 대한 모든 적절한 참조 카운트 작전을 적절한 다리 캐스트를 추가해야 할 것이다.

+0

이렇게하는 유일한 방법입니까? –

+0

@WTP 잘 모름 - 현재까지 ARC와 많은 시간을 보내지 않았습니다. 싸다! :) – justin

+0

@WTP : 함수가 _inputStream 및 _outputStream의 이전 내용을 자체의 새로운 CRStreamRef로 압축하므로 CFStreamRefs로 만들 수 있음을 잊지 마십시오. – JeremyP

0

ARC가 수행하는 작업과 __ 브리지 캐스트가하는 작업에 대해 생각해보십시오. ARC는 NSObject를 보존하거나 해제하는 책임을집니다. __ 브리지 캐스트는 그 책임을 양도합니다. 예를 들어, __bridge_retained는 NSString을 유지하고 포인터를 CFStringRef에 캐스트 한 다음 CFStringRef를 사용하는 사람에게 일치하는 릴리스 작업을 수행 할 책임을 넘깁니다.

은 NSObject * 또는 Core Foundation ref에 대한 포인터를 사용할 수 없습니다. 포인터가 메모리 위치를 가리 킵니다. 어떤 종류의 NSObject * 또는 Core Foundation 객체도 거기에 저장할 수 있습니다.

NSInputStream * 및 CFReadStreamRef에 대해 하나씩 두 개의 변수가 필요합니다. 적절한 브리지 캐스트를 사용하여 NSInputStream *을 CFReadStreamRef로 이동합니다. 이제 원하는 것을 얻었고 주소를 전달할 수 있습니다.