Swift中的免费桥接和指针访问

 一林泽鹏_444 发布于 2023-01-11 18:38

我正在将一个App从Objective-C移植到Swift,我需要使用以下方法:

CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \
readStream: CMutablePointer?>, \
writeStream: CMutablePointer?>)

旧的逻辑看起来像这样(几个网站似乎都同意):

CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, \
                                   &readStream, &writeStream);

NSInputStream inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream outputStream = (__bridge_transfer NSOutputStream *)writeStream;

由于免费桥接,这很好用.但是,ARC在"Swift-space"中不存在,并且类型系统已经改变.

如何将我的流变成实例

CMutablePointer?>, and
CMutablePointer?>

然后NSStreamCFStreamCreatePairWithSocketToHost调用之后将它们转换回子类?

2 个回答
  • 我得到了它的工作,这是我的代码:确保你在某处保留连接类的引用:-)

    class Connection : NSObject, NSStreamDelegate {
        let serverAddress: CFString = "127.0.0.1"
        let serverPort: UInt32 = 8443
    
        private var inputStream: NSInputStream!
        private var outputStream: NSOutputStream!
    
        func connect() {
            println("connecting...")
    
            var readStream:  Unmanaged<CFReadStream>?
            var writeStream: Unmanaged<CFWriteStream>?
    
            CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream)
    
            // Documentation suggests readStream and writeStream can be assumed to
            // be non-nil. If you believe otherwise, you can test if either is nil
            // and implement whatever error-handling you wish.
    
            self.inputStream = readStream!.takeRetainedValue()
            self.outputStream = writeStream!.takeRetainedValue()
    
            self.inputStream.delegate = self
            self.outputStream.delegate = self
    
            self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
            self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    
            self.inputStream.open()
            self.outputStream.open()
        }
    
        func stream(stream: NSStream, handleEvent eventCode: NSStreamEvent) {
            println("stream event")
        }
    }
    

    2023-01-11 18:40 回答
  • 我无法得到其他人在此主题中提供的示例.当然,他们编译了,但是一旦连接打开就会崩溃.

    但是,我在WWDC 2014讨论(和iOS 8发行说明)中注意到,有一种新方法可以初始化NSStream以创建一对绑定的输入/输出流.

    见下文:

    var inputStream: NSInputStream?
    var outputStream: NSOutputStream?
    
    NSStream.getStreamsToHostWithName("localhost", port: 1234, inputStream: &inputStream, outputStream: &outputStream)
    

    这消除了对笨拙的CFStreamCreatePairWithSocketToHost调用的需要,并消除了对非托管资源的需求.

    2023-01-11 18:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有