[英]Cast of an indirect pointer to an Objective-C pointer to 'CFReadStreamRef *' is disallowed with ARC
我想將CFStreamCreatePairWithSocketToHost
與NSInput
和OutputStream
一起使用。 我有兩個ivars NSInputStream *_inputStream
和NSOutputStream *_outputStream
。
以下給出了兩條錯誤消息:
CFStreamCreatePairWithSocketToHost(NULL,
(__bridge_retained CFStringRef)self.hostname, self.port,
(CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream);
錯誤:ARC不允許使用指向'
CFReadStreamRef *
'(又名'struct __CFReadStream **
')的Objective-C指針的間接指針
錯誤:ARC不允許使用指向'CFWriteStreamRef *
'(又名'struct __CFWriteStream **
')的Objective-C指針的間接指針
我該如何解決這個問題? 我嘗試使用__bridge
但我得到了類似的錯誤消息。
傳遞指向實際CFReadStreamRef
和CFWriteStreamRef
變量的指針,然后在分配給NSType時進行轉換。 基本上:
CFThingRef cfThing = NULL;
CFFunctionGetThing(&cfThing);
NSThing * nsThing = cfThing;
當然,您必須添加適當的橋接轉換並為cfThing
執行所有適當的引用計數操作。
想想ARC正在做什么,以及__bridge演員做什么:ARC負責保留/釋放NSObject。 __bridge轉移了這項責任。 例如,__ bridge_retained保留NSString,將指針強制轉換為CFStringRef,並將負責執行匹配的釋放操作交給使用CFStringRef的人。
這不可能使用指向NSObject *的指針或指向Core Foundation ref的指針。 指針指向內存位置。 任何類型的NSObject *或Core Foundation對象都可以存儲在那里。
您需要兩個變量,一個用於NSInputStream *,另一個用於CFReadStreamRef。 使用適當的橋接強制轉換將NSInputStream *移動到CFReadStreamRef。 現在你有你想要的東西,並且可以傳遞地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.