首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的免费桥接和指针访问

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

Stack Overflow用户
提问于 2014-06-04 04:26:54
回答 5查看 10.3K关注 0票数 23

我正在将一个应用程序从Objective移植到Swift,我需要使用以下方法:

代码语言:javascript
复制
CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \
readStream: CMutablePointer<Unmanaged<CFReadStream>?>, \
writeStream: CMutablePointer<Unmanaged<CFWriteStream>?>)

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

代码语言:javascript
复制
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空间”中,而且这种类型的系统已经发生了变化。

如何将我的流转换为

代码语言:javascript
复制
CMutablePointer<Unmanaged<CFReadStream>?>, and
CMutablePointer<Unmanaged<CFWriteStream>?>

然后在调用NSStream之后将它们转换回CFStreamCreatePairWithSocketToHost子类?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-04 17:46:56

我已经开始工作了,下面是我的代码:确保在某个地方保存一个连接类的引用:-)

代码语言:javascript
复制
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")
    }
}
票数 42
EN

Stack Overflow用户

发布于 2014-07-02 19:21:04

我无法让其他人在这个线程中提供的例子起作用。当然,他们编译了,但是一旦连接打开,他们就崩溃了。

但是,我在2014年的讨论(和iOS 8发布说明)中注意到,有一种新的方法来初始化NSStream,用于创建绑定的输入/输出流对。

见下文:

代码语言:javascript
复制
var inputStream: NSInputStream?
var outputStream: NSOutputStream?

NSStream.getStreamsToHostWithName("localhost", port: 1234, inputStream: &inputStream, outputStream: &outputStream)

这消除了对尴尬的CFStreamCreatePairWithSocketToHost调用的需求,也消除了对非托管资源的需求。

票数 28
EN

Stack Overflow用户

发布于 2014-06-05 03:14:50

我想出了怎么做。几个重要的注意事项:

  1. 如果使用&运算符,CMutablePointers将自动创建。
  2. 您可以在带有TgetRetainedValue()Unmanaged<T>中获得.getUnretainedValue() (似乎.getUnretainedValue()类似于__bridge_transfer)
  3. 选项自动初始化为nil
  4. 如果可选的是nil,它将转换为false条件。

到目前为止,我(未经测试):

代码语言:javascript
复制
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, \
&readStream, &writeStream)

if (readStream && writeStream) {
    inputStream = readStream!.takeUnretainedValue();
    outputStream = writeStream!.takeUnretainedValue();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24028995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档