CFStreamCreatePairWithSocketToHost 意外崩溃 Swift
CFStreamCreatePairWithSocketToHost crashes unexpectedly with Swift
终于可以在这里问我的第一个问题了!
预先:Xcode 7.1.1,OS 10.11.2,iOS 9.0.2(在物理设备上)
我正在编写一个与我的 Raspberry Pi 通信的小应用程序。我有一些从 tutorial 借来的用 Obj-C 编写的工作代码(用于 iOS 7),它在 Obj-C 中对我来说一切正常(连接和行为符合预期皮)。问题在于为 Swift/iOS 9(这是目标)重写它。
好的一点:
func initNetworkCommunication() {
var readStream: Unmanaged<CFReadStreamRef>?
var writeStream: Unmanaged<CFWriteStreamRef>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
outputStream.open()
}
我认为问题出在上面,因为这是堆栈中的最后一个方法调用,但是应用程序在几乎没有信息的情况下安静地崩溃:
如有任何帮助,我们将不胜感激!
请随时询问更多信息。
p.s。我了解本网站的格式相当 "strict",如有任何遗漏、过度等问题,请告诉我 :)
我已经解决了。
首先:
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
应该是:
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
其次,我将连接从 ViewController(我最初使用此方法的地方)抽象到一个名为 Connection 的新 class。
连接如下:
import UIKit
class Connection: NSObject, NSStreamDelegate {
var inputStream: NSInputStream!
var outputStream: NSOutputStream!
func connect() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
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()
}
}
我经常发现开始输入这些可以帮助我:p
终于可以在这里问我的第一个问题了!
预先:Xcode 7.1.1,OS 10.11.2,iOS 9.0.2(在物理设备上)
我正在编写一个与我的 Raspberry Pi 通信的小应用程序。我有一些从 tutorial 借来的用 Obj-C 编写的工作代码(用于 iOS 7),它在 Obj-C 中对我来说一切正常(连接和行为符合预期皮)。问题在于为 Swift/iOS 9(这是目标)重写它。
好的一点:
func initNetworkCommunication() {
var readStream: Unmanaged<CFReadStreamRef>?
var writeStream: Unmanaged<CFWriteStreamRef>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
outputStream.open()
}
我认为问题出在上面,因为这是堆栈中的最后一个方法调用,但是应用程序在几乎没有信息的情况下安静地崩溃:
如有任何帮助,我们将不胜感激!
请随时询问更多信息。
p.s。我了解本网站的格式相当 "strict",如有任何遗漏、过度等问题,请告诉我 :)
我已经解决了。
首先:
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
应该是:
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
其次,我将连接从 ViewController(我最初使用此方法的地方)抽象到一个名为 Connection 的新 class。
连接如下:
import UIKit
class Connection: NSObject, NSStreamDelegate {
var inputStream: NSInputStream!
var outputStream: NSOutputStream!
func connect() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
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()
}
}
我经常发现开始输入这些可以帮助我:p