6

Quiero usar CFStreamCreatePairWithSocketToHost con NSInput y OutputStream s. Tengo dos ivars NSInputStream *_inputStream y NSOutputStream *_outputStream.Se rechaza la conversión de un puntero indirecto a un puntero de Objective-C a 'CFReadStreamRef *' con ARC

El siguiente me da dos mensajes de error:

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

¿Cómo puedo solucionar esto? Intenté usar __bridge pero recibí mensajes de error similares.

Respuesta

4

Pasa un puntero a las variables reales CFReadStreamRef y CFWriteStreamRef, y luego transfiéralo al asignar a tus NSTypes. Básicamente:

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

Por supuesto, tendrá que añadir el elenco puente apropiado y hacer todas las operaciones de recuento de referencia adecuado para cfThing.

+0

¿Es esta la única manera de hacer esto? –

+0

@WTP No estoy seguro - No he pasado mucho tiempo con ARC hasta la fecha. ¡Envolverlo! :) – justin

+0

@WTP: no olvide que la función eliminará el contenido anterior de _inputStream y _outputStream con sus propios CRStreamRefs, por lo que podría hacerlos CFStreamRefs. – JeremyP

0

Piense en lo que está haciendo ARC, y lo que hace __bridge castts: ARC se responsabiliza de retener/liberar NSObjects. __bridge echa transferencia de esa responsabilidad. Por ejemplo, __bridge_retained conserva un NSString, emite el puntero a CFStringRef y se le asigna la responsabilidad de realizar la operación de lanzamiento correspondiente a quien utiliza CFStringRef.

No es posible que funcione con un puntero a un NSObject * o un puntero a una ref. Core Foundation. Un puntero apunta a una ubicación de memoria. Cualquier clase de objeto NSObject * o Core Foundation podría almacenarse allí.

Necesita dos variables, una para un NSInputStream * y otra para un CFReadStreamRef. Utilice el molde de puente apropiado para mover NSInputStream * a CFReadStreamRef. Ahora tiene lo que quiere y puede pasar la dirección.

Cuestiones relacionadas