簡體   English   中英

使用ARC不允許使用指向'CFReadStreamRef *'的Objective-C指針的間接指針

[英]Cast of an indirect pointer to an Objective-C pointer to 'CFReadStreamRef *' is disallowed with ARC

我想將CFStreamCreatePairWithSocketToHostNSInputOutputStream一起使用。 我有兩個ivars NSInputStream *_inputStreamNSOutputStream *_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但我得到了類似的錯誤消息。

傳遞指向實際CFReadStreamRefCFWriteStreamRef變量的指針,然后在分配給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM